3

我需要不时使用fabfile远程启动远程盒子中的一些程序,并得到结果。由于程序需要很长时间才能完成,我希望让它在后台运行,所以我不需要等待。所以我尝试了 os.fork() 让它工作。问题是,当我 ssh 到远程框,并在那里使用 os.fork() 运行程序时,程序可以在后台正常工作,但是当我尝试使用 fabfile 运行时,sudo 远程启动程序,os. fork() 不能工作,程序只是默默地死掉。所以我切换到 Python-daemon 来守护程序。很长一段时间,它工作得很好。但是现在当我开始让我的程序读取一些 Python 搁置字典时,python-daemon 不能再工作了。好像如果你使用 python-daemon,搁置的字典不能正确加载,我不知道为什么。

4

2 回答 2

4

如果我理解你的问题是正确的,我认为你让这太复杂了。 os.fork()用于多处理,而不是在后台运行程序。

假设为了讨论,您想要运行program.sh并收集它发送到标准输出的内容。要使用织物执行此操作,请在本地创建:

fabfile.py:

from fabric.api import run
def runmyprogram():
    run('./program.sh > output 2> /dev/null < /dev/null &')

然后,在本地运行:

fab -H remotebox runmyprogram

该程序将远程执行,但 Fabric 不会等待它完成。稍后您可能需要使用 scp 来收集输出文件。“&”使它在远程机器的后台运行,并且输出重定向对于避免挂起的结构会话是必要的。

如果您不需要使用织物,有更简单的方法可以做到这一点。您可以单独 ssh 并运行

nohup ./program.sh > output &

然后稍后再回来检查输出。

如果这是您要定期执行的操作,这可能是更好的选择,因为您可以设置一个 cron 作业以每隔一段时间运行一次,然后随时收集输出。

如果您不想稍后收获输出文件,可以使用:

fabfile.py:

from fabric.api import run
def runmyprogram():
    run('./program.sh')

然后,在您的本地机器上:

fab -H remotebox runmyprogram > output &

这些作业将远程运行,并将其所有输出放回本地输出文件。这在本地机器的后台运行,因此您可以做其他事情。但是,如果本地和远程计算机之间的连接可能会中断,最好使用第一种方法,这样输出始终会安全地存储在远程计算机上。

于 2011-06-05T22:17:06.750 回答
2

对于那些将来遇到此帖子的人。Python-daemon 仍然可以工作。只是确保在同一进程中加载​​搁置字典。所以之前搁置的字典是在父进程中加载​​的,当 python-daemon 产生一个子进程时,字典处理程序没有正确传递。当我们解决这个问题时,一切都会重新开始。

感谢那些对此线程提出宝贵意见的人!

于 2011-06-06T23:04:17.173 回答