sighup 信号是一个很古老的信号,跟拨号啊,终端机啊什么有关系。
大家常常会听到这样的说法:当你 ssh 断开的时候,你 ssh 下面的程序会收到 sighup 信号,那么默认情况下程序就会退出。所以你需要用 nohup,disown 之类来做处理,避免程序退出。
那么实际上是怎么回事呢?
这个事情分成两个层面:
- sighup 是跟 tty 有关系的
- 对 ssh 而言,是跟 pts 有关系
- 进程从 pts 断开时,操作系统会给进程发送 sighup 信号
- 推论:没有 pts,那么就不会有 sighup
- 收到 sighup 的进程可以选择如何处理 sighup 信号
- 对 bash 而言,如果是有 job control,那么就会对 job 进行 sighup 信号转发
- disown 这就是解绑了上面讲的 job control 的关系。nohup 也是做了类似的事情。
那么,现在你可以灵活运用这个原理来处理 sighup 的问题了。
习题:
- 如果你 ssh 到远程,在 bash 下启动一个程序放到后台,然后退出 shell,那么那个子进程会收到 sighup 信号并退出吗?
- 如果你 ssh -T (notty)到远程,默认启动了 bash,然后你把 sshd 杀掉,bash 也退出了,是为什么呢?怎么诊断这个问题?
- 如果你 ssh -T (notty)到远程,默认启动了 bash,你再启动 sleep 600,然后你把 sshd 杀掉,bash 和 sleep 会退出吗?
祝玩的愉快!