2011-11-01 123 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。但我可以稍後再檢查。

相關問題