我有一些perl脚本,通过SSH在远程gerrit服务器上执行一些命令。 它运行在Debian lenny虚拟机上。 在几个月里,它被以如下方式执行:
./script.pl &>~/script.log & disown
一切正常。 但是从上个星期五起,这个脚本及其subprocess(“sh -c ssh ….”和“ssh …”)在远程命令执行期间的某个时刻就会挂起。 “ps x”显示所有的状态T(sTopped)。 发送SIGCONT不会有什么帮助。 他们立即在SIGSTOP之后收回。
交互式运行这个脚本时,我看不到这样的有线行为(现在它在屏幕上工作,没有任何问题)。
我试图使用strace来调查发生了什么,但我无法捕捉这个错误,因为这些脚本交互式启动时效果很好。 我不知道谁可以发送SIGSTOP,我不知道哪个进程会首先接收这个信号。 我能以某种方式找出这些信息吗? 这个问题怎么能被调查呢?
PS我的责任范围仅限于监视和重新启动(如果需要)此脚本。 我不知道负责人在这台服务器或远程gerrit服务器上做了哪些更改。
经过strace的更多的实验(感谢womble的评论),我发现我的SSH进程招收SIGTTIN,这导致我面临的问题。 从谷歌的第一个链接“ssh SIGTTIN”澄清的情况: http ://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch07_04.htm节“7.4.5.6。后台远程命令”:
ssh提供了-n命令行选项来解决这个问题。 它redirect标准input来自/ dev / null,防止input阻塞ssh。