Linux
從 Perl 執行的 SSH 立即獲得 SIGSTOP
我有一些 perl 腳本,它通過 SSH 在遠端 gerrit 伺服器上執行一些命令。它在 Debian lenny 虛擬機上執行。在幾個月的時間裡,它以下列方式執行:
./script.pl &>~/script.log & disown
一切都執行良好。然而,從上週五開始,該腳本及其子程序(“sh -c ssh ….”和“ssh …”)恰好在遠端命令執行期間的某個時刻掛起。“ps x” 顯示所有這些的狀態 T (sTopped)。發送 SIGCONT 並沒有真正的幫助。他們在它之後立即收到 SIGSTOP。
以互動方式執行此腳本時,我看不到這種有線行為(現在它在螢幕上執行沒有任何問題)。
我嘗試使用 strace 來調查發生了什麼,但我無法捕捉到這個錯誤,因為這個腳本在互動啟動時執行良好。我不知道誰可以發送 SIGSTOP,也不知道哪個程序首先接收到這個信號。我能以某種方式找到這些資訊嗎?如何調查此類問題?
PS 我的職責範圍僅限於監視和重新啟動(如果需要)此腳本。我不知道負責人在此伺服器或遠端 gerrit 伺服器上進行了哪些更改。
在對 strace 進行了更多實驗後(感謝 womble 的評論),我發現我的 ssh 程序接收了 SIGTTIN,這導致了我面臨的問題。來自Google的“ssh SIGTTIN”的第一個連結澄清了這種情況: http : //docstore.mik.ua/orelly/networking_2ndEd/ssh/ch07_04.htm 部分“7.4.5.6。後台遠端命令”:
ssh 提供了 -n 命令行選項來解決這個問題。它將標準輸入重定向到來自 /dev/null,從而防止 ssh 阻塞輸入。