为何ssh一关闭,程序就再也不运行了?


问题描述

  • 当SSH远程链接到服务器上,而后运行一个程序,eg: ./test.sh, 而后把终端开闭(切断SSH链接)以后,发现该程序中断.

缘由

  • 主要元凶: 挂断信号(SIGHUP) 信号

概念介绍

  • 在Linux/Unix中,有这样几个概念:
  • 进程组(process group): 一个或多个进程的集合,每个进程组有惟一一个进程组ID,即进程组长进程的ID.
  • 会话期(session): 一个或多个进程组的集合,有惟一一个会话期首进程(session leader). 会话期ID为首进程的ID.
  • 会话期能够有一个单独的控制终端(controlling terminal).
  • 与控制终端链接的会话期首进程叫作控制进程(controlling process).
  • 当前与终端交互的进程称为前台进程组.
  • 其他进程组称为后台进程组.
  • 根据POSIX.1定义: 挂断信号(SIGHUP)默认的动做是终止程序。

解释

  • 当终端接口检测到网络链接断开, 将挂断信号发送给控制进程(会话期首进程).
  • 若是会话期首进程终止,则该信号发送到该会话期前台进程组.
  • 一个进程退出致使一个孤儿进程组产生时, 若是任意一个孤儿进程组进程处于STOP状态, 发送 SIGHUP 和 SIGCONT 信号到该进程组中全部进程.
  • 孤儿进程参照

结论

  • 所以当网络断开或终端窗口关闭后, 也就是SSH断开之后, 控制进程收到 SIGHUP 信号退出, 会致使该会话期内其余进程退出.
  • 简而言之: 就是 ssh 打开之后, bash等都是他的子程序, 一旦ssh关闭, 系统将全部相关进程杀掉!! 致使一旦ssh关闭, 执行中的任务就取消了.

相关问题

为何守护程序就算是 ssh 打开的, 关闭ssh也不会影响其运行?

  • 由于他们的程序特殊, 好比httpd –k start运行这个之后, 他不属于sshd这个进程组, 而是单独的进程组, 因此就算关闭了ssh, 和他也没有任何关系!

使用后台运行命令 & 可否将程序摆脱ssh进程组控制? 即关闭 ssh, 后台程序可否继续运行?

  • 只要是ssh 打开执行的通常命令,不是守护程序,不管加不加&,一旦关闭ssh,系统就会用SIGHUP终止.

如何解决方案

  • 在远端开启 tmux , 在 tmux 里运行程序, 此时运行的程序属于 tmux 的进程组, 不属于 ssh 进程组.
  • 使用 nohup 命令

http://zjking.blog.51cto.com/976858/1117828bash

相关文章
相关标签/搜索