Ответ 1
Я использую предложение Erich Heine для использования "dtach", и он работает очень хорошо для меня:
def runbg(cmd, sockname="dtach"):
return run('dtach -n 'mktemp -u /tmp/%s.XXXX' %s' % (sockname, cmd))
Это было найдено здесь.
Я пытаюсь запустить процесс 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))
Я использую предложение Erich Heine для использования "dtach", и он работает очень хорошо для меня:
def runbg(cmd, sockname="dtach"):
return run('dtach -n 'mktemp -u /tmp/%s.XXXX' %s' % (sockname, cmd))
Это было найдено здесь.
Как я уже экспериментировал, решение представляет собой комбинацию двух факторов:
Итак, ваша функция должна выглядеть так:
def background_run(command):
command = 'nohup %s &> /dev/null &' % command
run(command, pty=False)
И вы можете запустить его с помощью:
execute(background_run, your_command)
Это экземпляр этот вопрос. Фоновые процессы будут уничтожены, когда команда закончится. К сожалению, CentOS 6 не поддерживает команды sudo pty-less.
В заключительной записи в вопросе упоминается использование sudo('set -m; service servicename start')
. Это включает управление заданиями, и поэтому фоновые процессы помещаются в их собственную группу процессов. В результате они не заканчиваются, когда команда заканчивается.
Более подробную информацию см. в этой ссылке.
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!
вам просто нужно запустить
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)
Изменить: мне нужно было убедиться, что файл 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 ... &
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, тем более, что я не знаю, почему это работает...)
nohup
не работал для меня, и у меня не было tmux
или dtach
установленных на всех ящиках, которые я хотел использовать, поэтому я закончил использовать screen
так:
run("screen -d -m bash -c '{}'".format(command), pty=False)
Это говорит, что экран запускает оболочку bash в отдельном терминале, который запускает вашу команду
Хотелось добавить это как комментарий, но читать его легко, когда есть много строк.
Похоже, что лучшим решением уже упоминалось использование 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)