запустите фоновый процесс с помощью nohup с помощью fabric

Я пытаюсь запустить процесс celerycam с помощью fabric, используя приведенную ниже команду nohup. К сожалению, ничего не происходит, вручную с помощью той же команды я мог бы начать процесс, но не через ткань. Какие-нибудь советы о том, как я могу это решить?

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))

9 ответов


Я использую предложение Эриха Гейне использовать "dtach", и он работает довольно хорошо для меня:

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

Это было здесь.


Как я экспериментировал, решение представляет собой комбинацию двух факторов:

  • запустить процесс как демон: команды nohup ./ command & > / dev / null&
  • использовать pty=False для ткани run

Итак, ваша функция должна выглядеть так:

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

и вы можете запустить его с:

execute(background_run, your_command)

Это пример этот вопрос. Фоновые процессы будут убиты, когда команда завершится. К сожалению, на CentOS 6 не поддерживает команды sudo без pty.

в последней записи в выпуске упоминается использование sudo('set -m; service servicename start'). Это включает управление заданиями, и поэтому фоновые процессы помещаются в свою собственную группу процессов. В результате они не завершаются, когда команда завершается.

для получения дополнительной информации см. этой ссылка.


DTACH-это путь. Это программное обеспечение, которое вам нужно установить как облегченную версию экрана. Это лучшая версия "dtach" - метода, найденного выше, при необходимости он установит dtach. Его нужно найти!--2-->здесь где вы также можете узнать, как получить результат процесса, который работает в фоновом режиме:

from fabric.api import run
from fabric.api import sudo
from fabric.contrib.files import exists


def run_bg(cmd, before=None, sockname="dtach", use_sudo=False):
    """Run a command in the background using dtach

    :param cmd: The command to run
    :param output_file: The file to send all of the output to.
    :param before: The command to run before the dtach. E.g. exporting
                   environment variable
    :param sockname: The socket name to use for the temp file
    :param use_sudo: Whether or not to use sudo
    """
    if not exists("/usr/bin/dtach"):
        sudo("apt-get install dtach")
    if before:
        cmd = "{}; dtach -n `mktemp -u /tmp/{}.XXXX` {}".format(
            before, sockname, cmd)
    else:
        cmd = "dtach -n `mktemp -u /tmp/{}.XXXX` {}".format(sockname, cmd)
    if use_sudo:
        return sudo(cmd)
    else:
        return run(cmd)

пусть это поможет вам, как это помогло мне запустить omxplayer через ткань на удаленном rasberry pi!


вам просто нужно запустить

run("(nohup yourcommand >& /dev/null < /dev/null &) && sleep 1")

вы можете столкнуться с этот вопрос

попробуйте добавить "pty=False" в команду sudo (я предполагаю, что virtualenv вызывает sudo или работает где-то?)


это сработало для меня:

sudo('python %s/manage.py celerycam --detach --pidfile=celerycam.pid' % siteDir)

Edit: я должен был убедиться, что файл pid был удален первым, так что это был полный код:

# Create new celerycam
sudo('rm celerycam.pid', warn_only=True)
sudo('python %s/manage.py celerycam --detach --pidfile=celerycam.pid' % siteDir)

вы можете использовать :

run('nohup /home/ubuntu/spider/bin/python3 /home/ubuntu/spider/Desktop/baidu_index/baidu_index.py > /home/ubuntu/spider/Desktop/baidu_index/baidu_index.py.log 2>&1 &', pty=False)

я смог обойти эту проблему, запустив nohup ... & над ssh в отдельном локальном скрипт. В fabfile.py:

@task
def startup():
    local('./do-stuff-in-background.sh {0}'.format(env.host))

и do-stuff-in-background.sh:

#!/bin/sh

set -e
set -o nounset

HOST=

ssh $HOST -T << HERE
   nohup df -h 1>>~/df.log 2>>~/df.err &
HERE

конечно, вы также можете передать команду и стандартные файлы журнала вывода / ошибок в качестве аргументов, чтобы сделать этот скрипт более полезным.

(в моем случае у меня не было прав администратора для установки dtach, а не screen -d -m, ни pty=False / sleep 1 работал должным образом для меня. YMMV, тем более, что я понятия не имею почему это работает...)