2011-11-01 90 views
3

如果我上运行host1外壳和我做ssh host2 some-command,然后我关闭终端窗口(或以其他方式杀死host1ssh过程)似乎对host2sshd进程终止很及时。但是... some-command发生了什么?根据它的命令,它有时会终止,但有时不会。 some-command接收哪些信号?什么文件描述符(如果有的话)被操纵,以及如何?进程在其父进程sshd终止时发生了什么?

回答

3

它没有收到任何信号。如果它们没有以某种方式重定向,则三个标准IO流是来自ssh进程的管道,因此从stdin读取将返回EOF,写入stdout或stderr将失败并引发SIGPIPE。如果某些命令没有在标准流上执行I/O操作,它将没有理由提前终止。

+1

你确定吗? 'ssh'可能会创建一个终端,又名伪tty(取决于选项),如果有的话,我希望其他进程为其tty控制终端接收'SIGHUP'。 –

+0

啊哈,但那是关键。 'ssh somehost some-command' does * not * allocate a pty!它只是一个管道。你必须用'-t'来请求一个pty。因此,我所看到的导致我问这个问题的行为(我的工作没有收到任何信号,只是他们的标准输入关闭)是合理的。 – Glyph

0

如果你的机器上有dtrace,你可以用

dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }' 

命令从here检查。另见this

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