Подтвердить что ты не робот

Запустите фоновый процесс с помощью nohup, используя ткань

Я пытаюсь запустить процесс celerycam с использованием тэков с помощью команды 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))
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

execute(background_run, your_command)

Ответ 3

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

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

Более подробную информацию см. в этой ссылке.

Ответ 4

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

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!

Ответ 5

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

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

Ответ 6

Возможно, вы столкнулись с этой проблемой

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

Ответ 7

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

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

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

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

Ответ 8

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

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)

Ответ 9

Мне удалось обойти эту проблему, запустив nohup ... & over ssh в отдельной локальной оболочке script. В 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=$1

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

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

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

Ответ 10

nohup не работал для меня, и у меня не было tmux или dtach установленных на всех ящиках, которые я хотел использовать, поэтому я закончил использовать screen так:

run("screen -d -m bash -c '{}'".format(command), pty=False)

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

Ответ 11

Хотелось добавить это как комментарий, но читать его легко, когда есть много строк.

Похоже, что лучшим решением уже упоминалось использование nohup поскольку для него не требуется дополнительное программное обеспечение. Для тех, кто заинтересован в запуске его с помощью сложного оператора командной строки, вы можете использовать bash -c с правильно указанной командной строкой.

@staticmethod
def background_run(command):
    from six.moves import shlex_quote
    command = '(nohup bash -c %s &>/dev/null < /dev/null &) && /bin/true' \
              % shlex_quote(command)
    run(command, pty=False)