【问题标题】:Disassociating process pipes from the calling shell解除进程管道与调用 shell 的关联
【发布时间】:2017-08-01 02:37:13
【问题描述】:

我正在尝试使用Fabric 发送命令,这些命令将在共享相同存储的许多不同计算机上运行许多物理模拟(可执行文件)。我希望我的脚本

  1. ssh入机
  2. 开始模拟,例如通过运行run('nohup nice -n 5 ./interp 1 2 7')(可执行文件名为interprun 是来自Fabric.api 库的函数)
  3. 脱离外壳并在另一台(或同一台)计算机上运行另一个模拟。

但是,我无法让 Fabric 完成第 3 部分。它在第一次模拟时挂起,直到模拟停止才分离,这破坏了整点。 我的问题,根据the documentation 是吗

因为 Fabric 会在每次调用 run 或 sudo(另见)时在远程端执行一个 shell,所以通过 shell 将进程作为后台将不会按预期工作。后台进程可能仍然会阻止调用 shell 退出,直到它们停止运行,这反过来又会阻止 Fabric 继续自己的执行。

解决这个问题的关键是确保你的进程的标准管道都与调用 shell 解除关联

文档提供了 3 条建议,但我无法“使用预先存在的守护程序技术”,我有权访问的计算机没有安装 screentmuxdtach (我也不能安装它们),并且在我的命令中包含 >& /dev/null < /dev/null 的第二个建议也没有奏效(据我所知,它没有任何改变)。

还有其他方法可以解除进程管道与调用 shell 的关联吗?

【问题讨论】:

  • 能否将第二步改为在屏幕内运行?例如; screen -dmS physicstest run('nohup nice -n 5 ./interp 1 2 7') 将启动一个名为“physicstest”的屏幕(或虚拟终端),并在其中运行以下命令。这样,即使物理模拟仍在运行,启动它的命令也会随着屏幕的创建完成。理想情况下,这意味着 shell 应该能够立即断开连接,而不是等待。
  • 嗨,我在帖子中指出我无权访问screen
  • 啊,我的错。如果是这样的话,我不确定你的要求是否可行。我可能是错的,但根据我的经验,结束一个 shell 会杀死所有子进程。您可以访问netcat 吗?如果是这样,您可以从主计算机发送消息,只要在远程计算机上运行脚本来解释它们。

标签: python bash shell fabric scientific-computing


【解决方案1】:

您链接到的文档提供了一个使用 nohup 的示例,您没有密切关注该示例。将该示例与您迄今为止尝试过的内容合并为我提供了一些东西,因为我没有安装 Fabric,因此无法测试,但尝试一下可能会很有趣:

run('nohup nice -n 5 ./interp 1 2 7 < /dev/null &> /tmp/interp127.out &')

如果您不关心 interp 命令向其 stdout/stderr 发出什么,则将输出重定向到 /dev/null 而不是我设计的输出文件 (/tmp/interp127.out)。

假设上述方法有效,我不确定您将如何检测到模拟已完成,但您的问题似乎与该细节无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2013-12-15
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多