我需要不时使用fabfile远程启动远程盒子中的一些程序,并得到结果。由于程序需要很长时间才能完成,我希望让它在后台运行,所以我不需要等待。所以我尝试了 os.fork() 让它工作。问题是,当我 ssh 到远程框,并在那里使用 os.fork() 运行程序时,程序可以在后台正常工作,但是当我尝试使用 fabfile 运行时,sudo 远程启动程序,os. fork() 不能工作,程序只是默默地死掉。所以我切换到 Python-daemon 来守护程序。很长一段时间,它工作得很好。但是现在当我开始让我的程序读取一些 Python 搁置字典时,python-daemon 不能再工作了。好像如果你使用 python-daemon,搁置的字典不能正确加载,我不知道为什么。
2 回答
如果我理解你的问题是正确的,我认为你让这太复杂了。 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 &
这些作业将远程运行,并将其所有输出放回本地输出文件。这在本地机器的后台运行,因此您可以做其他事情。但是,如果本地和远程计算机之间的连接可能会中断,最好使用第一种方法,这样输出始终会安全地存储在远程计算机上。
对于那些将来遇到此帖子的人。Python-daemon 仍然可以工作。只是确保在同一进程中加载搁置字典。所以之前搁置的字典是在父进程中加载的,当 python-daemon 产生一个子进程时,字典处理程序没有正确传递。当我们解决这个问题时,一切都会重新开始。
感谢那些对此线程提出宝贵意见的人!