当我们关闭shell时,由该shell开启的程序也会被退出,即使这个程序是在后台运行的。
➜ ~ sleep 100 & [1] 23023 ➜ ~ jobs -l [1] + 23023 running sleep 100 ➜ ~ ps -ef | grep sleep yt 23023 22888 0 19:14 pts/0 00:00:00 sleep 100 ➜ ~ # 关闭shell再开个新的 ➜ ~ ps -ef | grep sleep
可以看到,当我们关闭shell的后,sleep进程也退出了。
原因就是在shell退出时,会给在该shell内开启的进程发送SIGHUP,如果指定程序没有处理这个signal,就会执行默认行为,也就是退出。
我们再用nohup开启试下:
➜ ~ nohup sleep 100 & [1] 23597 nohup: ignoring input and appending output to 'nohup.out' ➜ ~ jobs -l [1] + 23597 running nohup sleep 100 ➜ ~ ps -ef | grep sleep yt 23597 23065 0 19:22 pts/0 00:00:00 sleep 100 ➜ ~ # 关闭shell再开个新的 ➜ ~ ps -ef | grep sleep yt 23597 1259 0 19:22 ? 00:00:00 sleep 100 ➜ ~ kill 23597 ➜ ~ ps -ef | grep sleep
我们可以看到,即使shell退出了,sleep也没有退出,因为nohup使sleep进程忽略了SIGHUP信号。
注:以上测试是在zsh中进行的。在bash中测试时,关闭bash并没有给sleep进程发送SIGHUP。
更多signal的信息请看Linux下的signal机制