Linux中让进程在后台运行的办法

修行者 电脑技巧 1896浏览 7评论

    在Linux中,一般情况下,我们在命令后面加上&即可让进程在后台运行:

  $ ./test.sh &

  [1] 17208

  $ jobs -l

  [1]+ 17208 Running ./test.sh &

    实际上,这样是将命令放入到一个作业队列中了,而对于已经在前台执行的命令,需先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:

  $ ./test.sh

  [1]+ Stopped ./test.sh

  $ bg %1

  [1]+ ./test.sh &

  $ jobs -l

  [1]+ 22794 Running ./test.sh &

    但是用以上方法到后台执行的进程,其父进程是当前终端shell的进程,一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。

    如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1):

  $ echo $$

  21734

  $ nohup ./test.sh &

  [1] 29016

  $ ps -ef | grep test

  515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh

  515 29713 21734 0 11:47 pts/12 00:00:00 grep test

  $ setsid ./test.sh &

  [1] 409

  $ ps -ef | grep test

  515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh

  515 413 21734 0 11:49 pts/12 00:00:00 grep test

    如上使用nohup/setsid加上&使进程在后台运行,且不受当前shell退出的影响了。那么对于已经在后台运行的进程,该怎么办呢?我们可以使用disown命令:

  $ ./test.sh &

  [1] 2539

  $ jobs -l

  [1]+ 2539 Running ./test.sh &

  $ disown -h %1

  $ ps -ef | grep test

  515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh

  515 2542 21734 0 11:52 pts/12 00:00:00 grep test

    还有一种方法是将进程在一个subshell中执行,和setsid有异曲同工之处,就是将命令用括号() 括起来,方法比较简单:

  $ (./test.sh &)

  $ ps -ef | grep test

  515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh

  515 12483 21734 0 11:59 pts/12 00:00:00 grep test

    另外不同的Linux系统和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。

    还有一种好的方法是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

  $ screen -dmS screen_test

  $ screen -list

  There is a screen on:

  27963.screen_test (Detached)

  1 Socket in /tmp/uscreens/S-jiangfeng.

  $ screen -r screen_test 

修行者

本文地址http://xxzh.org/computer/Linux-jincheng-houtai-yunxing.html

版权说明:如非注明,本站文章均为 修行者博客 原创,转载请注明出处和附带本文链接。

已有7位小伙伴发表了看法
  1. 签名

    签名游客 回复Ta 不错 收下了 博主辛苦了

  2. Firm

    Firm游客 回复Ta 这些都是比较实用的

  3. 学夫子

    学夫子游客 回复Ta 没有用过这个系统,纯支持啦,呵呵

  4. 七七

    七七游客 回复Ta 方便实用的方法,支持了!

  5. nfljersey

    nfljersey游客 回复Ta 呵呵 抢个板凳啊!博主你真是有才

  6. 伯虎博客www.ibohu.net

    伯虎博客www.ibohu.net游客 回复Ta 哈哈 我是沙发垫

  7. joyla

    joyla游客 回复Ta 啊哦! 沙发!

发表评论(友情提示:可直接按Ctrl+Enter提交评论)
来宾的头像
访客