sshd 派生一个子进程来创建一个新会话。这是 pstree 的输出(部分):
sshd(1230) -- sshd(1234) -- bash
(...)
|- sshd(1235) -- bash -- a.out -- a.out
运行 "kill -9 1235" 后,a.out 死掉(捕获的信号是 SIGHUP)
为什么?
谢谢!
ssh
(与终端仿真器、screen
、tmux
、script
和其他一些程序一起)使用称为“伪 tty”(或“pty”)的东西,其行为类似于拨号调制解调器连接。我这样描述它是因为这是这种行为的历史起源:如果您由于某种原因丢失了调制解调器连接,tty(或 pty)驱动程序检测到载体丢失并将SIGHUP
(" Hangup
") 发送到您的会话。这使程序能够保存其状态(例如,vi
/vim
将保存您已修改但未保存以供恢复的所有文件)并干净地关闭。同样,如果网络连接由于某种原因断开(有人绊倒了电源或网络电缆?...或sssh
出于某种奇怪的原因丢弃了核心),pty 发送SIGHUP
到您的会话,以便有机会保存任何未保存的数据。
从技术上讲,tty/pty 驱动程序将信号发送到附加到终端的进程组中的每个进程(进程组也与 shell 作业控制有关,但这是它们的最初目的)。其他一些终端信号以相同的方式处理,例如Ctrl+C发送SIGINT
和Ctrl+\发送SIGQUIT
(和Ctrl+Z发送SIGTSTP
,以及不SIGTSTP
通过暂停自己处理的程序被发送SIGSTOP
;这个双重信号允许vim
将终端从编辑模式设置回正常模式并且在许多终端仿真器中交换到预编辑屏幕缓冲区)。