在后台远程启动Python程序

时间:2011-06-05 15:42:48

标签: python fork shelve python-daemon

我需要使用fabfile不时在远程盒子中远程启动某些程序,并获得结果。由于程序需要很长时间才能完成,我希望它能在后台运行,所以我不需要等待。所以我尝试了os.fork()来使它工作。问题是,当我ssh到远程盒子,并在那里使用os.fork()运行程序时,程序可以在后台工作正常,但是当我尝试使用fabfile的运行时,sudo远程启动程序,os。 fork()无法正常工作,程序只是默默地死去。所以我切换到Python-daemon来对程序进行daemonalize。很长一段时间,它完美地运作。但是现在当我开始让我的程序读取一些Python搁置的dicts时,python-daemon就不能再工作了。好像如果你使用python-daemon,shelve dicts无法正确加载,我不知道为什么。除了os.fork()和Python-daemon之外,任何人都有一个想法,我还能尝试解决我的问题吗?

2 个答案:

答案 0 :(得分:4)

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

让我们说为了讨论你想运行program.sh并收集它发送到标准输出的内容。要使用fabric执行此操作,请在本地创建:

fabfile.py:

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

然后,在本地,运行:

fab -H remotebox runmyprogram

程序将远程执行,但结构不会等待它完成。您可能需要稍后收集输出文件,可能使用scp。 “&amp;”使其在远程机器的后台运行,并且avoid a hung fabric session需要输出重定向。

如果您不需要使用布料,可以使用更简单的方法。你可以单独ssh并运行

nohup ./program.sh > output &

然后稍后回来查看输出。

如果这是你定期做的事情,这可能是更好的选择,因为你可以设置一个cron作业来经常运行,然后随时收集输出。

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

fabfile.py:

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

然后,在您的本地计算机上:

fab -H remotebox runmyprogram > output &

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

答案 1 :(得分:2)

对于那些将来遇到这篇文章的人。 Python-daemon仍然可以工作。只需确保在同一过程中加载搁置dicts。所以以前shelve dicts是在父进程中加载​​的,当python-daemon生成子进程时,dict处理程序没有正确传递。当我们解决这个问题时,一切都会再次发挥作用。

感谢那些在这个帖子上提出宝贵意见的人!