在后台远程启动Python程序

我需要使用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之外,任何人都有一个想法,我还能尝试解决我的问题吗?

解决方法:

如果我理解你的问题,我认为你这太复杂了. 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. “&”使其在远程机器的后台运行,并且输出重定向必须为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 &

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

上一篇:相当于Java中的python的shelve模块


下一篇:shelve:极其强大的序列化模块