如果我们关闭启动linux的终端,linux会杀死后台进程吗?
我有一个嵌入式系统,我在上面做如果我们关闭启动linux的终端,linux会杀死后台进程吗?,linux,shell,telnet,job-control,Linux,Shell,Telnet,Job Control,我有一个嵌入式系统,我在上面做telnet,然后在后台运行一个应用程序: ./app_name & 现在,如果我关闭我的终端并从另一个终端执行telnet,如果我进行检查,那么我可以看到这个过程仍在运行 为了验证这一点,我编写了一个小程序: #包括 main() { 而(1),; } 我在本地的linux pc后台运行了这个程序,然后关闭了终端 现在,当我从另一个终端检查这个进程时,我发现这个进程也被终止了 我的问题是: 为什么对同一类型的流程有未定义的行为 它依赖于什么 它是否依
telnet
,然后在后台运行一个应用程序:
./app_name &
现在,如果我关闭我的终端并从另一个终端执行telnet
,如果我进行检查,那么我可以看到这个过程仍在运行
为了验证这一点,我编写了一个小程序:
#包括
main()
{
而(1),;
}
我在本地的linux pc后台运行了这个程序,然后关闭了终端
现在,当我从另一个终端检查这个进程时,我发现这个进程也被终止了
我的问题是:
- 为什么对同一类型的流程有未定义的行为
- 它依赖于什么
- 它是否依赖于Linux的版本
- AFAIK在这两种情况下,进程都应该终止。为了避免这种情况,您必须发布如下nohup:
> nohup ./my_app &
这样,您的流程将继续执行。telnet部分可能是由于与此类似的错误造成的:
为了完全理解发生了什么,您需要稍微了解一下
unix
内部结构
当您运行这样的命令时
/app\u名称&
app\u name
被发送到后台进程组。您可以查看有关unix进程组的信息
当您以正常退出方式关闭bash
时,它会触发所有作业的SIGHUP
挂断信号。有关unix
作业控制的一些信息已发布
为了在退出bash
时保持应用程序运行,您需要使用nohup
实用程序使应用程序不受挂断信号的影响
nohup-运行不受挂起影响的命令,并将输出设置为非tty
最后,你需要这样做
nohup应用程序名称&2>/dev/null代码>当您关闭终端时,shell会向所有后台进程发送SIGHUP
,这会杀死它们。这可以通过几种方式加以抑制,最显著的是:
诺胡普
使用nohup
运行程序时,它捕获SIGHUP
并重定向程序输出
$ nohup app &
否认
disown
告诉shell不要发送SIGHUP
$ app &
$ disown
它是否依赖于linux的版本?
这取决于你的外壳。以上内容至少适用于bash,谁应该杀了乔布斯?
通常,在不同的情况下,内核或shell发送的SIGHUP
会终止前台和后台作业
内核何时发送SIGHUPSIGHUP
?
内核将SIGHUP发送到:
- 对于真实(硬件)终端:当在终端驱动程序中检测到断开连接时,例如在调制解调器线路上挂断李>
- for(pty):当引用pty主端的最后一个描述符关闭时,例如当您关闭终端窗口时
内核向其他进程组发送SIGHUP
:
- 到前台进程组,当控制进程终止时李>
- 到,当它成为孤儿并且已停止成员时
控制进程是建立到控制终端的连接的会话负责人
通常,控制过程是您的shell。总而言之:
- 当实终端或伪终端断开/关闭时,内核向shell发送
SIGHUP
李>
- 当shell终止时,内核向前台进程组发送
SIGHUP
李>
- 如果孤立进程组包含已停止的进程,内核将向该组发送
SIGHUP
请注意,如果内核不包含停止的进程,它不会将SIGHUP
发送到后台进程组
bash
何时发送SIGHUP
?
Bash向所有作业(前台和后台)发送SIGHUP
:
- 当它接收到SIGHUP时,它是一个交互式shell(并且在编译时启用了作业控制支持)李>
- 退出时,它是一个交互式登录shell,并且设置了
huponexit
选项(并且在编译时启用作业控制支持)
请参阅更多详细信息
注:
bash
不向使用disown
从作业列表中删除的作业发送SIGHUP
李>
- 进程使用
nohup
忽略SIGHUP
启动
更多细节
其他贝壳呢?
通常,Shell会传播SIGHUP
。在正常出口处生成SIGHUP
的情况不太常见
Telnet或SSH
在telnet或SSH下,当连接关闭时(例如,当您关闭PC上的telnet
窗口时),应发生以下情况:
客户死亡李>
服务器检测到客户端连接已关闭李>
服务器关闭pty的主机端李>
内核检测到主pty已关闭,并将SIGHUP
发送到bash
李>
bash
接收SIGHUP
,向所有作业发送SIGHUP
,并终止李>
每个作业接收到SIGHUP
并终止
问题
我可以使用bash
和telnetd
从busybox
或dropbear
SSH服务器复制您的问题:有时,当客户端连接关闭时,后台作业不会收到SIGHUP
(并且不会终止)
当服务器(telnetd
或dropbear
)关闭pty的主机侧时,似乎出现了竞态条件:
通常,bash
接收SIGHUP
并立即终止后台作业(如预期的那样)并终止李>
但有时,bash
在处理SIGHUP
之前在pty的从机端检测到EOF
当bash
检测到EOF
时,默认情况下会立即终止,而不发送SIGHUP
。后台作业仍在运行