bash - 如何防止后台命令立即挂起

标签 bash ssh jobs

想象一下这个脚本(不考虑身份验证和其他内容,所有 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/

相关文章:

linux - grep 的基本表达式不支持\d 吗?

linux - Bash:从文件中读取时,剪切不会剪切第一行

amazon-web-services - 如何在同一子网上使用第二个弹性网络接口(interface)

macos - vim + COPY + mac 通过 SSH

mysql - 在 MySQL 中等同于 MS SQL 作业?

c - 如何让 tcsetpgrp() 在 C 中工作?

perror 示例可以改进吗?

linux - sshfs - 未找到设备

python - 从 Rails 服务器排队 Python 后台作业

bash - 在 bash 脚本上正确格式化 crontab 可执行文件