想象一下这个脚本(不考虑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
状态?
答案 0 :(得分:0)
感谢n.m.
。解决方案是将< /dev/null
传递给stdin。通过这样做,子进程关闭stdin并且不会像前一个导致挂起状态的情况一样阻止控制台IO。