nohup and &
今天来解决下一直存在的一个疑问 nohup
和 &
到底是什么?
在日常中使用往往是这样子的1
nohup php demo.php &
但是为什么要两个一起用呢? 只用一个行不行? 只用其中的一个是什么效果呢?
我们先看最后一个问题
只用
&
&的意思是在后台运行, 就是当你运行代码php demo.php &
时, 即使你使用Ctrl C
,代码照样会运行(因为对SIGINT信号免疫)。但是要注意, 当你关掉shell后,php demo.php
进程就消失了。可见&
的后台并不硬(因为对SIGHUP信号不免疫)只用
nohup
nohup的意思是忽略SIGHUP信号, 所以当运行nohup demo.php
的时候, 关闭shellphp demo.php
进程还是存在(对SIGHUP信号免疫)。 但是直接在shell中使用Ctrl C
,php demo.php
进程就会消失(因为对SIGINT信号不免疫)。
所以, &和nohup没有半毛钱的关系, 要让进程真正不受shell中Ctrl C和shell关闭的影响, 那该怎么办呢? 那就用 nohup php demo.php &
吧, 两全其美。
解决了最后一个问题, 其他问题就迎刃而解啦
如果你懂守护进程, 那么 nohup php demo.php &
颇有点让 php demo.php
成为守护进程的感觉。
2019-11-26 补充:
今天看Redis源码的时候,看到这样一行代码1
signal(SIGHUP, SIG_IGN);
其中:
SIG_IGN:向内核表示忽略此信号(记住有两个信号SIGKILL和SIGSTOP不能忽略)。
所以,这个跟nohup的效果是一样的。
本文作者 : Xuebin Zhang
原文链接 : https://capping.github.io/2018/08/30/nohup-and-&/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!