Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我们关闭启动linux的终端,linux会杀死后台进程吗?_Linux_Shell_Telnet_Job Control - Fatal编程技术网

如果我们关闭启动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
      会终止前台和后台作业


      内核何时发送SIGHUP
      SIGHUP
      ? 内核将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
      。后台作业仍在运行