如何防止后台命令立即暂停

时间:2018-03-08 14:50:06

标签: bash ssh jobs

想象一下这个脚本(不考虑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状态,永远保留。当然,我可以使用fgkill -CONT PID将其带回来,但这些都是连续的。我需要并行运行所有命令,等待所有命令完成。

你知道为什么会这样,以及如何避免suspended状态?

1 个答案:

答案 0 :(得分:0)

感谢n.m.。解决方案是将< /dev/null传递给stdin。通过这样做,子进程关闭stdin并且不会像前一个导致挂起状态的情况一样阻止控制台IO。