【发布时间】:2017-08-01 02:37:13
【问题描述】:
我正在尝试使用Fabric 发送命令,这些命令将在共享相同存储的许多不同计算机上运行许多物理模拟(可执行文件)。我希望我的脚本
-
ssh入机 - 开始模拟,例如通过运行
run('nohup nice -n 5 ./interp 1 2 7')(可执行文件名为interp,run是来自Fabric.api库的函数) - 脱离外壳并在另一台(或同一台)计算机上运行另一个模拟。
但是,我无法让 Fabric 完成第 3 部分。它在第一次模拟时挂起,直到模拟停止才分离,这破坏了整点。 我的问题,根据the documentation 是吗
因为 Fabric 会在每次调用 run 或 sudo(另见)时在远程端执行一个 shell,所以通过 shell 将进程作为后台将不会按预期工作。后台进程可能仍然会阻止调用 shell 退出,直到它们停止运行,这反过来又会阻止 Fabric 继续自己的执行。
解决这个问题的关键是确保你的进程的标准管道都与调用 shell 解除关联
文档提供了 3 条建议,但我无法“使用预先存在的守护程序技术”,我有权访问的计算机没有安装 screen、tmux 或 dtach (我也不能安装它们),并且在我的命令中包含 >& /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