запустите фоновый процесс с помощью 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!
вы можете столкнуться с этот вопрос
попробуйте добавить "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, тем более, что я понятия не имею почему это работает...)