当父进程sshd终止时,它的子进程会发生什么?

3
如果我在host1上运行shell,并执行ssh host2 some-command,然后关闭终端窗口(或以其他方式杀死host1上的ssh进程),似乎host2上的sshd进程很快就会终止。但是...some-command会发生什么?根据命令的不同,它有时会终止,但有时不会。some-command会接收到哪些信号?哪些文件描述符(如果有)会被操作?
2个回答

4

它没有接收到任何信号。如果它们没有以某种方式重定向,那么三个标准的IO流都是与ssh进程之间的管道,因此从stdin中读取将返回EOF,并且对stdout或stderr之一的写入将失败并引发SIGPIPE。如果some-command不在标准流上执行I/O操作,则它将没有理由过早终止。


1
你确定吗?ssh 可能会创建一个终端,也可能是伪终端(取决于选项),如果它这样做了,我会期望其他进程,对于该终端是控制终端的进程,会收到 SIGHUP 信号。 - Ben Voigt
啊哈,但这就是关键。ssh somehost some-command不会分配pty!它只是创建一个管道。您必须使用-t请求pty。因此,我看到的行为导致我提出这个问题(我的作业没有接收到任何信号,只是关闭了它们的标准输入)是有道理的。 - Glyph

0
如果您的计算机上安装了 dtrace,您可以使用以下命令进行检查:
dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'

这里获取命令。还可以查看这个

我现在的Linux机器上没有dtrace。但是我稍后可以检查它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接