使用fabric开始使用nohup的后台进程

Mo *_*abi 27 python fabric

我正在尝试使用下面的nohup命令使用fabric启动celerycam进程.不幸的是,没有任何事情发生,手动使用相同的命令我可以启动过程但不通过结构.关于我如何解决这个问题的任何建议?

def start_celerycam():
    '''Start celerycam daemon'''
    with cd(env.project_dir):
        virtualenv('nohup bash -c "python manage.py celerycam --logfile=%scelerycam.log --pidfile=%scelerycam.pid &> %scelerycam.nohup &> %scelerycam.err" &' % (env.celery_log_dir,env.celery_log_dir,env.celery_log_dir,env.celery_log_dir))
Run Code Online (Sandbox Code Playgroud)

dan*_*van 30

我正在使用Erich Heine的建议来使用'dtach',它对我来说效果很好:

def runbg(cmd, sockname="dtach"):
    return run('dtach -n `mktemp -u /tmp/%s.XXXX` %s' % (sockname, cmd))
Run Code Online (Sandbox Code Playgroud)

这是在这里找到的.

  • 我尝试了很多不同的方法.这是最终奏效的. (3认同)

Mar*_*ana 18

正如我的实验,解决方案是两个因素的组合:

  • 将进程作为守护进程运行:nohup ./command&>/dev/null&
  • 使用pty = False进行结构运行

所以,你的函数应该是这样的:

def background_run(command):
    command = 'nohup %s &> /dev/null &' % command
    run(command, pty=False)
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令启动它:

execute(background_run, your_command)
Run Code Online (Sandbox Code Playgroud)


Tim*_*ski 8

这是此问题的一个实例.命令结束时将终止后台进程.不幸的是,CentOS 6不支持pty-less sudo命令.

该问题的最后一个条目提及使用sudo('set -m; service servicename start').这将打开作业控制,因此后台进程将放入其自己的进程组中.因此,当命令结束时,它们不会被终止.

有关更多信息,请参阅链接.


小智 5

你只需要跑步

run("(nohup yourcommand >& /dev/null < /dev/null &) && sleep 1")
Run Code Online (Sandbox Code Playgroud)

  • 哇,你是怎么发现的?一个稍微简单的版本也是`(nohup yourcommand&>/dev/null </ dev/null&)&&/bin/true` (3认同)