【发布时间】:2018-03-08 14:50:05
【问题描述】:
想象一下这个脚本(不要考虑 auth 和其他东西,所有 SSH 命令都可以在没有& 的情况下运行)
(ssh foo.com "/bin/sleep 5 && echo 1") &
(ssh bar.com "/bin/sleep 5 && echo 1") &
wait
echo "My commands finished"
现在,我希望我的所有 SSH 命令立即作为后台作业运行,然后在完成后,我会收到最终的“我的命令已完成”消息。
但事实并非如此......
实际发生的事情是这样的
[1] 16155
[1] + 16155 suspended (tty input) ssh foo.com "/bin/sleep 5 && echo 1"
[2] 16156
[2] + 16156 suspended (tty input) ssh bar.com "/bin/sleep 5 && echo 1"
My commands finished
所以所有后台命令都会立即进入suspended 状态,它们将永远停留在那里。当然,我可以用fg 或kill -CONT PID 将它们带回来,但这都是顺序的。我需要并行运行所有命令,然后等待所有命令完成。
您知道这是为什么以及如何避免suspended 状态吗?
【问题讨论】:
-
他们正在等待终端输入。也许您需要输入凭据。
-
@n.m.不,他们不是,auth 是通过证书完成的,当不使用
&时,相同的命令运行得非常好 -
试试
ssh < /dev/null ... -
可能您的终端设置有误。在运行后台命令之前,您是否尝试过
stty -tostop? -
我认为这是一个 bash/posix shell 编程问题,而不是纯粹的配置/系统管理员问题,因此它似乎非常适合 Stack Overflow 并且不适合 Server Fault。因此,我投票决定重新提出这个问题。