只添加了&运行符号,没有nohup,为什么退出后,进程仍然在?
问题描述:
我们在使用linux时,会经常要把一个程序放到后台运行,这时候就需要在程序的最后使用【&】符号,但是当直接关闭这个终端时,程序就会退出。
但是我们ssh登录,测试
sleep 86400 >/dev/null 2>&1 &
退出当前ssh窗口,再连接上,发现sleep进程并没有被kill掉。
问题描述总结为:ssh登录机器,通过添加(&),启动任务到后台,通过exit命令退出,任务依然存在
问题分析:
bash有如下配置项,默认关闭(通过命令:shopt 查看):
huponexit off
当huponexit 为off时,exit时不会向终端所属任务发SIGHUP信号,通过命令可以激活该选项:
shopt -s huponexit
重复进行上述测试,exit时后台进程退出
相关基础学习总结
后台任务
把它改成"后台任务"(background job)。
sleep 1000 &
只要在命令的尾部加上符号&,启动的进程就会成为"后台任务"。
"后台任务"有两个特点。
- 继承当前 session (对话)的标准输出(stdout)和标准错误(stderr)。因此,后台任务的所有输出依然会同步地在命令行下显示。
- 不再继承当前 session 的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)。
执行后台任务的同时,用户还可以输入其他命令。
SIGHUP信号
变为"后台任务"后,一个进程是否就成为了守护进程呢?或者说,用户退出 session 以后,"后台任务"是否还会继续执行?
Linux系统是这样设计的。
- 用户准备退出 session
- 系统向该 session 发出SIGHUP信号
- session 将SIGHUP信号发给所有子进程
- 子进程收到SIGHUP信号后,自动退出
上面的流程解释了,为什么"前台任务"会随着 session 的退出而退出:因为它收到了SIGHUP信号。
那么,"后台任务"是否也会收到SIGHUP信号?
这由 Shell 的huponexit参数决定的。
$ shopt | grep huponexit
执行上面的命令,就会看到huponexit参数的值。
大多数Linux系统,这个参数默认关闭(off)。因此,session 退出的时候,不会把SIGHUP信号发给"后台任务"。所以,一般来说,"后台任务"不会随着 session 一起退出。
linux shopt
1.将huponexit设置为off
shopt -u huponexit
2.将huponexit设置为on
shopt -s huponexit
3.查看当前系统huponexit对应的值
[root@dev workspace]# shopt |grep huponexit
huponexit off