专栏名称: 程序员的那些事
最有影响力的程序员自媒体,关注程序员相关话题:IT技术、IT职场、在线课程、学习资源等。
目录
相关文章推荐
OSC开源社区  ·  Gitee ... ·  9 小时前  
伯乐在线  ·  扛不住了?58 ... ·  11 小时前  
伯乐在线  ·  扛不住了?58 ... ·  11 小时前  
码农翻身  ·  3个中国程序员 vs ... ·  昨天  
逸言  ·  数据库选型对领域建模的影响 ·  2 天前  
51好读  ›  专栏  ›  程序员的那些事

Linux - 请允许我静静地后台运行

程序员的那些事  · 公众号  · 程序员  · 2017-07-26 21:56

正文

请到「今天看啥」查看全文


首先是我们最经常遇到的符号 &,将它附在命令后面可以使进程在后台执行,不会占用前台界面。它实际上是在会话中开启了一个后台作业,对作业的操作我们后面再说。


但我们会发现,如果此时终端被关闭后,进程还是会退出。这是因为,& 符号只有让进程让出前台终端的功能,无法让进程不受 SIGHUP 信号的影响。


nohup


nohup 应该是另外一个我们常用的命令了,它的作用如其字面意思,使进程不受 SIGHUP 信号的影响。但我们在使用 nohup php test.php 后会发现,进程还会一直占用前台终端,但即使终端被关闭或连接断开了,程序还是会执行,另外我们会发现在当前文件夹下多了个名为 nohup.out 的文件。


这是因为 nohup 的功能仅仅是让进程不受 SIGHUP 信号的影响,并不会让出前台终端,而且它还会在命令执行目录下建立 nohup.out 用以存储进程的输出。如果进程不需要输出,且不想让 nohup 创建文件,可以将标准输出和标准错误输出重定向。


我们常将 nohup 和 & 搭配到一块使用,执行命令如下 nohup command >/dev/null 2>&1 & 这样,就可以放心的等待进程运行结果了。


setsid


setsid 是另一个让进程在后台执行的命令,它的作用是让进程打开一个新的会话并运行进程,使用方式为 setsid command。


根据上面的概念我们得知终端关闭后进程退出是因为会话首进程向进程发送了 SIGHUP 信号,setsid 就厉害了,它直接打开一个新的会话来执行命令,那么原会话的终端的状态就再也不会影响到此进程了。


我们使用 pstree 来查看使用 setsid 和 nohup ... & 两种命令来运行进程时的进程树状态。


  • nohup php test.php &


pstree - a | grep - C 6 test

|- sshd

| ` - sshd

| ` - sshd

| ` - bash

| ` - sudo - s

| ` - bash

|                       |- grep - C 6 test

|                       |- php test . php

| ` - pstree - a


我是用 ssh 远程登陆的机器,所以 test.php 进程是挂在 sshd 进程下的。正常情况下,一旦 sshd 进程结束,则 test.php也无法幸免。


  • setsid php test.php








请到「今天看啥」查看全文