linux shopt | 只添加了&运行符号,没有nohup,为什么退出后,进程仍然在?

只添加了&运行符号,没有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系统是这样设计的。

  1. 用户准备退出 session
  2. 系统向该 session 发出SIGHUP信号
  3. session 将SIGHUP信号发给所有子进程
  4. 子进程收到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

猜你喜欢

转载自blog.csdn.net/inthat/article/details/124866969