【问题标题】:How to prevent background command going to suspend immediately [duplicate]如何防止后台命令立即挂起[重复]
【发布时间】: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 状态,它们将永远停留在那里。当然,我可以用fgkill -CONT PID 将它们带回来,但这都是顺序的。我需要并行运行所有命令,然后等待所有命令完成。

您知道这是为什么以及如何避免suspended 状态吗?

【问题讨论】:

  • 他们正在等待终端输入。也许您需要输入凭据。
  • @n.m.不,他们不是,auth 是通过证书完成的,当不使用 & 时,相同的命令运行得非常好
  • 试试ssh < /dev/null ...
  • 可能您的终端设置有误。在运行后台命令之前,您是否尝试过 stty -tostop
  • 我认为这是一个 bash/posix shell 编程问题,而不是纯粹的配置/系统管理员问题,因此它似乎非常适合 Stack Overflow 并且不适合 Server Fault。因此,我投票决定重新提出这个问题。

标签: bash ssh jobs


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多