Linux入门之Linux环境下如何让进程在后台运行

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

一. nohup / setsid / &

使用场景:如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?

我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

解决方法:

1.nohup

只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用>filename 2>&1来更改缺省的重定向文件名。


  1. [[email protected] ~]# nohup ping www.ibm.com &
  2. [1] 3059
  3. nohup: appending output to `nohup.out‘
  4. [[email protected] ~]# ps -ef |grep 3059
  5. root      3059   984  0 21:06 pts/3    00:00:00 ping www.ibm.com
  6. root      3067   984  0 21:06 pts/3    00:00:00 grep 3059
  7. [[email protected] ~]#

2. setsid

setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。


  1. [[email protected] ~]# setsid ping www.ibm.com
  2. [[email protected] ~]# ps -ef |grep www.ibm.com
  3. root     31094     1  0 07:28 ?        00:00:00 ping www.ibm.com
  4. root     31102 29217  0 07:29 pts/4    00:00:00 grep www.ibm.com
  5. [[email protected] ~]#

上例中我们的进程 ID(PID)为31094,而它的父 ID(PPID)为1(即为 init 进程 ID),并不是当前终端的进程 ID。请将此例与nohup 例中的父 ID 做比较。

3. &

将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中 当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。


  1. [[email protected] ~]# (ping www.ibm.com &)
  2. [[email protected] ~]# ps -ef |grep www.ibm.com
  3. root     16270     1  0 14:13 pts/4    00:00:00 ping www.ibm.com
  4. root     16278 15362  0 14:13 pts/4    00:00:00 grep www.ibm.com
  5. [[email protected] ~]#

新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。

二. disown

使用场景:如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?

解决方法:这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了

  • 用disown -h jobspec来使某个作业忽略HUP信号。
  • 用disown -ah 来使所有的作业都忽略HUP信号。
  • 用disown -rh 来使正在运行的作业忽略HUP信号。

当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。

disown 示例1(如果提交命令时已经用“&”将命令放入后台运行,则可以直接使用“disown”)


  1. [[email protected] build]# cp -r testLargeFile largeFile &
  2. [1] 4825
  3. [[email protected] build]# jobs
  4. [1]+  Running                 cp -i -r testLargeFile largeFile &
  5. [[email protected] build]# disown -h %1
  6. [[email protected] build]# ps -ef |grep largeFile
  7. root      4825   968  1 09:46 pts/4    00:00:00 cp -i -r testLargeFile largeFile
  8. root      4853   968  0 09:46 pts/4    00:00:00 grep largeFile
  9. [[email protected] build]# logout

disown 示例2(如果提交命令时未使用“&”将命令放入后台运行,可使用 CTRL-z 和“bg”将其放入后台,再使用“disown”)


  1. [[email protected] build]# cp -r testLargeFile largeFile2
  2. [1]+  Stopped                 cp -i -r testLargeFile largeFile2
  3. [[email protected] build]# bg %1
  4. [1]+ cp -i -r testLargeFile largeFile2 &
  5. [[email protected] build]# jobs
  6. [1]+  Running                 cp -i -r testLargeFile largeFile2 &
  7. [[email protected] build]# disown -h %1
  8. [[email protected] build]# ps -ef |grep largeFile2
  9. root      5790  5577  1 10:04 pts/3    00:00:00 cp -i -r testLargeFile largeFile2
  10. root      5824  5577  0 10:05 pts/3    00:00:00 grep largeFile2
  11. [[email protected] build]#

三: screen

使用场景: 我们已经知道了如何让进程免受 HUP 信号的影响,但是如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做这样的操作呢?

解决方案: 此时最方便的方法就是 screen 了。简单的说,screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。screen 的参数很多,具有很强大的功能,

  • 用screen -dmS (sessionName)来建立一个处于断开模式下的会话(并指定其会话名)。
  • 用screen -list 来列出所有会话。
  • 用screen -r (sessionName)来重新连接指定会话。
  • 用快捷键CTRL-a d 来暂时断开当前会话。

screen实例


  1. [[email protected] ~]# screen -dmS Urumchi
  2. [[email protected] ~]# screen -list
  3. There is a screen on:
  4. 12842.Urumchi   (Detached)
  5. 1 Socket in /tmp/screens/S-root.
  6. [[email protected] ~]# screen -r Urumchi

当我们用“-r”连接到 screen 会话后,我们就可以在这个伪终端里面为所欲为,再也不用担心 HUP 信号会对我们的进程造成影响,也不用给每个命令前都加上“nohup”或者“setsid”了。

1.未使用 screen 时新进程的进程树


  1. [[email protected] ~]# ping www.google.com &
  2. [1] 9499
  3. [[email protected] ~]# pstree -H 9499
  4. init─┬─Xvnc
  5. ├─acpid
  6. ├─atd
  7. ├─2*[sendmail]
  8. ├─sshd─┬─sshd───bash───pstree
  9. │       └─sshd───bash───ping

未使用 screen 时我们所处的 bash 是 sshd 的子进程,当 ssh 断开连接时,HUP 信号自然会影响到它下面的所有子进程(包括我们新建立的 ping 进程)。

2.使用了 screen 后新进程的进程树


  1. [[email protected] ~]# screen -r Urumchi
  2. [[email protected] ~]# ping www.ibm.com &
  3. [1] 9488
  4. [[email protected] ~]# pstree -H 9488
  5. init─┬─Xvnc
  6. ├─acpid
  7. ├─atd
  8. ├─screen───bash───ping
  9. ├─2*[sendmail]

而使用了 screen 后就不同了,此时 bash 是 screen 的子进程,而 screen 是 init(PID为1)的子进程。那么当 ssh 断开连接时,HUP 信号自然不会影响到 screen 下面的子进程了。

老男孩linux培训www.oldboyedu.com

时间: 2024-12-25 03:51:25

Linux入门之Linux环境下如何让进程在后台运行的相关文章

【简单的linux命令】1.解压、查看进程和后台运行

1.将tar.gz的压缩文件解压到指定目录 #将kfcenter.tar.gz解压到当前目录下的kfcenter文件中 tar -zxvf kfcenter.tar.gz -C ./kfcenter 2.查看当前运行的java进程 #查看当前正在运行的进程,并从其中筛选出跟java命令相关的 ps aux|ps java 3.后台运行 #将kfcenter.war运行起来,并且一直在后台运行 nohup java -jar kfcenter.war &

Linux(Ubuntu 13.04)环境下 Eclipse perl插件EPIC的安装

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14     这几天要学习perl,打算用eclipse这个IDE,那么装一个perl的插件是很有必要; 网上搜了下,安装EPIC大家提到最多的就是输入http://e-p-i-c.sf.net/updates/testing,但是我遇到的情况是一直在pending,令人抓狂: 后来参照Pydev的插件安装方法,试了下,成功了,下面就是我的步骤 我的系统:Ubuntu13.04 安装步骤: 1:到这里下载插件:http://pan.

window 和 linux 环境下杀死tomcat进程——也可以解决其他端口被占用的问题

1.应用场景 在Windows或者linux操作系统中,我们在启动一个tomcat服务器时,经常会发现8080端口已经被占用的错误,而我们又不知道如何停止这个tomcat服务器. 2.window环境下杀死进程 1.首先查找到占用8080端口的进程号PID是多少(tomcat默认是8080端口,假如你修改了tomcat的监听端口,请输入你的tomcat端口号) netstat -ano | findstr 8080 这个命令输出的最后一列表示占用8080端口的进程号是多少,假设为9572 2.k

linux入门基础——linux软件管理RPM

因为linux入门基础是基于CentOS讲解的,讲的是CentOS上的软件包管理.ubuntu的软件包管理有这些:ubuntu软件包管理,包管理指南,ubuntu软件包管理. linux软件管理:RPM软件包管理 源代码形式 绝大多数开源软件都是直接以源代码形式发布 源代码一般会被打包成tar.gz的归档压缩文件 程序源代码需要手动编译成二进制形式之后才能够运行使用 源代码基本编译流程: 1 ./configure   检查编译环境.相关库文件以及配置参数并生成makefile 2 make  

linux入门基础——linux扩展权限

linux扩展权限 linux的默认权限和特殊权限 创建一个文件:touch filename1 查看新文件的默认权限:ls -l filename1 -rw-rw-r-- 1 liu liu 0  6月  7 09:33 file1 创建一个文件夹:mkdir filename2 查看新文件夹的默认权限L:ls -ld filename2 drwxrwxr-x 2 liu liu 4096  6月  7 09:34 file2 发现默认情况下文件夹比文件多了一个执行x权限,否则无法查看文件夹,

Linux 技巧:让进程在后台运行的可靠方法

原文链接:http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/ 想让进程在断开连接后依然保持运行?如果该进程已经开始运行了该如何补救? 如果有大量这类需求如何简化操作? 我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理

Linux:让进程在后台运行

学习之余我最大的乐趣是找一部不错的电影慢慢品味,这也是我缓解压力的最好方式之一,由于我常去的字幕组网站需要签到才可以下载字幕,像这种娱乐网站谁有时间天天记得去签到呢,but作为一个准程序猿应该有更好的办法.果然我在github上逛了逛,便发现的一个不错的签到脚本,看来很多人都着和我一样的刚需呀,这里附上地址. 一动手很多问题便接踵而至,我打算把这个脚本运行在我的腾讯云服务器上面,并且定一个时间,让它每天在固定的时间run.可是我用的ssh 登录的远程Linux 服务器,如果直接按照那脚步的API

Linux Shell脚本生产环境下安全地删除文件

脚本编写背景 无论是生产环境.测试环境还是开发环境,经常需要使用rm命令删除&批量一些"重要"目录下的文件.按照Linux的哲学"小即是美"(一个程序只做一件事)+"用户清楚自己做什么"(用户知道自己想要什么,也明白自己在做什么,并且会为自己的行为负责),那么用户在执行rm时,一定要知道自己的操作可能引起的后果,因此"三思而后行"真的很重要.但这对于一部分人来讲,真的可能是灾难性的,手抖.手贱和任何错误的操作(在路径分

Linux( CentOS 6.6 ) 环境下使用 MONO + Jexus 配置 ASP.NET 以及MVC运行环境

1.本机环境如下图所示:(centOS 6.6) 2.使用yum安装必要的软件包(本机yum源是阿里云的配置): yum -y install gcc gcc-c++ bison pkgconfig glib2-devel gettext make libpng-devel libjpeg-devel libtiff-devel libexif-devel giflib-devel libX11-devel freetype-devel fontconfig-devel  cairo-devel