从 Perl 执行的 SSH 立即获得 SIGSTOP

从 Perl 执行的 SSH 立即获得 SIGSTOP

我有一些 perl 脚本,它通过 SSH 在远程 gerrit 服务器上执行一些命令。它在 Debian lenny 虚拟机上运行。在几个月内,它以以下方式执行:

./script.pl &>~/script.log &
disown

一切运行良好。然而从上周五开始,这个脚本及其子进程(“sh -c ssh ....”和“ssh ...”)在远程命令执行期间的某个时刻挂起。“ps x”显示所有进程的状态为 T(sTopped)。发送 SIGCONT 并没有真正起到作用。它们在发送 SIGCONT 后立即收到 SIGSTOP。

当以交互方式运行该脚本时,我看不到这种连线行为(现在它在屏幕上工作没有任何问题)。

我尝试使用 strace 来调查发生了什么,但我无法捕获此错误,因为此脚本在以交互方式启动时运行良好。我不知道谁可以发送 SIGSTOP,也不知道哪个进程首先接收到此信号。我能以某种方式找到此信息吗?如何调查此类问题?

PS 我的职责范围仅限于监控和重新启动(如果需要)此脚本。我不知道负责人在此服务器或远程 gerrit 服务器上做了哪些更改。

答案1

在对 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 阻塞输入。

相关内容