https://blog.csdn.net/qq_41854763/article/details/106602445
搜索nohup与&的用法与区别,可以搜到大量的博客,且内容几乎一样。本文写在那些博客的基础之上,建议读者看过几篇搜索到的博客之后再看下面的内容(当然直接看也没问题),相信你会有所收获。
用中文搜索nohup和&的用法,99%的文章都会告诉你:nohup可以使进程忽略SIGHUP信号,&可以使进程在后台运行。要使得进程在shell退出后依然运行,可以结合使用nohup与&,即
nohup your_command &
1
这个做法肯定是没有问题的。
但请思考一个问题,
首先,我在bash中执行一个命令,并只使用&:
command &
1
然后退出这个bash,再重新开一个bash,请问刚刚那个进程还在吗?
此处留5秒给你思考~
答案是,通常情况下,这个进程依然在!(不相信的读者可以自行测试)
那这里很多读者肯定就会有疑问了,&只是让进程在后台运行,exit后后台进程不应该也被kill了吗?忽略SIGHUP信号应该是nohup的功能啊,我并没有使用nohup啊?难道其他的博客都写错了嘛?
其实,博客并没错 。问题出在:bash默认情况下,在exit时并不会向后台的进程发送SIGHUP信号!!!
通过以下命令即可查看:
shopt | grep huponexit
1
这个命令的结果如果是off(默认值是off),也就是说,在exit bash时,并不会向后台的进程发送SIGHUP信号,所以退出后进程依然存在,用不用nohup没区别!
当然,如果将huponexit设为了true,想让进程在bash exit后依然运行,那就需要使用nohup了!
注意有时候关闭shell窗口也会让后台的程序推出。 所以结束终端的时候要用exit