想象一下这个脚本(不考虑身份验证和其他内容,所有 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.
。解决办法是通过< /dev/null
到标准输入。通过这样做,子进程会关闭标准输入,并且不会像之前导致挂起状态的情况那样阻止控制台 IO。
关于bash - 如何防止后台命令立即挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49175956/