Как запустить скрипт Python в фоновом режиме даже после выхода из SSH?
111
У меня есть скрипт Python, bgservice.pyи я хочу, чтобы он работал все время, потому что он является частью создаваемой мной веб-службы. Как я могу заставить его работать непрерывно даже после выхода из SSH?
когда я запускаю команду с помощью nohup и &, я получаю сообщение nohup: ignoring in put and appending output to nohup.out '', и когда я нажимаю клавишу ввода, процесс завершается со статусом 1. Что происходит?
Сантош Гимире
1
прочтите вывод в nohup.out. в моем случае это была проблема с разрешениями, мне нужно было использовать sudo
mxns
и как остановить службу bgservice после ее запуска в этом методе?
пожар в яме
1
@Shaegorath где-нибудь сохраните pid, чтобы вы могли отправлять сигналы процессу позже. в некоторых оболочках (bash, zsh и т. д.) после того, как вы это сделаете, somecommand &он напечатает pid как [1] 12345. в противном случае вы можете использовать $!.
Тони Бета Лямбда
32
Если вы уже запустили процесс и не хотите его останавливать и перезапускать под nohup, вы можете отправить его в фоновый режим, а затем отказаться от него.
Ctrl+Z (приостановить процесс)
bg (перезапустить процесс в фоновом режиме
disown %1(при условии, что это работа №1, используйте jobsдля определения)
Вы можете подумать о том, чтобы превратить ваш скрипт python в полноценный демон python, как описано здесь .
python-daemon - хороший инструмент, который можно использовать для запуска сценариев python в качестве фонового процесса демона, а не постоянно работающего сценария. Вам нужно будет немного изменить существующий код, но он прост и понятен.
Если вы столкнулись с проблемами с python-daemon, есть другой супервизор утилит , который сделает то же самое для вас, но в этом случае вам не придется писать какой-либо код (или изменять существующий), поскольку это готовое решение для демонизации процессы.
Вот простое решение внутри Python с использованием декоратора:
import os, time
def daemon(func):def wrapper(*args,**kwargs):if os.fork():return
func(*args,**kwargs)
os._exit(os.EX_OK)return wrapper
@daemondef my_func(count=10):for i in range(0,count):print('parent pid: %d'% os.getppid())
time.sleep(1)
my_func(count=10)#still in parent thread
time.sleep(2)#after 2 seconds the function my_func lives on is own
Конечно, вы можете заменить содержимое своего bgservice.pyфайла на my_func.
Если вам нужно, чтобы процесс работал вечно, независимо от того, вошли вы в систему или нет, рассмотрите возможность запуска процесса как демона.
supervisord - отличное готовое решение, которое можно использовать для демонстрации любого процесса. В нем есть еще одна управляющая утилита, supervisorctlкоторую можно использовать для мониторинга процессов, выполняемых супервизором.
Вам не нужно писать дополнительный код или изменять существующие сценарии, чтобы это работало. Более того, подробная документация значительно упрощает этот процесс.
После того, как я часами почесал голову вокруг python-daemon, супервизор - это решение, которое сработало для меня за считанные минуты.
Надеюсь, это поможет кому-то, кто пытается заставить работать python-daemon
import yapdi
daemon = yapdi.Daemon()
retcode = daemon.daemonize()# This would run in daemon mode; output is not visibleif retcode == yapdi.OPERATION_SUCCESSFUL:print('Hello Daemon')
nohup: ignoring in put and appending output to
nohup.out '', и когда я нажимаю клавишу ввода, процесс завершается со статусом 1. Что происходит?somecommand &
он напечатает pid как[1] 12345
. в противном случае вы можете использовать$!
.Если вы уже запустили процесс и не хотите его останавливать и перезапускать под nohup, вы можете отправить его в фоновый режим, а затем отказаться от него.
Ctrl+Z
(приостановить процесс)bg
(перезапустить процесс в фоновом режимеdisown %1
(при условии, что это работа №1, используйтеjobs
для определения)источник
Вы также можете использовать экран GNU, который должен быть почти в каждой системе Linux / Unix.
Если вы используете Ubuntu / Debian, его расширенный вариант byobu тоже неплох .
источник
Вы можете подумать о том, чтобы превратить ваш скрипт python в полноценный демон python, как описано здесь .
python-daemon - хороший инструмент, который можно использовать для запуска сценариев python в качестве фонового процесса демона, а не постоянно работающего сценария. Вам нужно будет немного изменить существующий код, но он прост и понятен.
Если вы столкнулись с проблемами с python-daemon, есть другой супервизор утилит , который сделает то же самое для вас, но в этом случае вам не придется писать какой-либо код (или изменять существующий), поскольку это готовое решение для демонизации процессы.
источник
Вы не можете этого сделать, но я предпочитаю экран .
источник
Вот простое решение внутри Python с использованием декоратора:
Конечно, вы можете заменить содержимое своего
bgservice.py
файла наmy_func
.источник
ЗШ оболочка имеет возможность сделать все фоновые процессы запускаются с поЬир.
В
~/.zshrc
добавить следующие строки:Тогда вам просто нужно запустить такой процесс:
python bgservice.py &
и вам больше не нужно использовать команду nohup.Я знаю, что не многие люди используют zsh, но это действительно классная оболочка, которую я бы порекомендовал.
источник
Если вам нужно, чтобы процесс работал вечно, независимо от того, вошли вы в систему или нет, рассмотрите возможность запуска процесса как демона.
supervisord - отличное готовое решение, которое можно использовать для демонстрации любого процесса. В нем есть еще одна управляющая утилита,
supervisorctl
которую можно использовать для мониторинга процессов, выполняемых супервизором.Вам не нужно писать дополнительный код или изменять существующие сценарии, чтобы это работало. Более того, подробная документация значительно упрощает этот процесс.
После того, как я часами почесал голову вокруг python-daemon, супервизор - это решение, которое сработало для меня за считанные минуты.
Надеюсь, это поможет кому-то, кто пытается заставить работать python-daemon
источник
Вы также можете использовать Yapdi :
Основное использование:
источник
Попробуй это:
Вы можете запустить указанную выше команду на экране и выйти за пределы экрана.
Теперь вы можете отслеживать журналы своего скрипта Python:
tail -f <your log file>.log
Чтобы убить ваш сценарий, вы можете использовать команды ps -aux и kill .
источник