Как запустить скрипт Python в фоновом режиме даже после выхода из SSH?


111

У меня есть скрипт Python, bgservice.pyи я хочу, чтобы он работал все время, потому что он является частью создаваемой мной веб-службы. Как я могу заставить его работать непрерывно даже после выхода из SSH?

Ответы:


213

Выполните, nohup python bgservice.py &чтобы сценарий игнорировал сигнал зависания и продолжал работу. Вывод будет вставлен nohup.out.

В идеале вы должны запускать свой скрипт с чем-то вроде, superviseчтобы его можно было перезапустить, если (когда) он умрет.


15
когда я запускаю команду с помощью 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для определения)



12

Вы можете подумать о том, чтобы превратить ваш скрипт python в полноценный демон python, как описано здесь .

python-daemon - хороший инструмент, который можно использовать для запуска сценариев python в качестве фонового процесса демона, а не постоянно работающего сценария. Вам нужно будет немного изменить существующий код, но он прост и понятен.

Если вы столкнулись с проблемами с python-daemon, есть другой супервизор утилит , который сделает то же самое для вас, но в этом случае вам не придется писать какой-либо код (или изменять существующий), поскольку это готовое решение для демонизации процессы.


краткое объяснение того, как можно решить проблему, как правило, является хорошей идеей.
Nikhil Sahu


5

Вот простое решение внутри 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

@daemon
def 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.


1
Может надо поймать сигнал SIGHUP. Затем добавьте signal.signal (signal.SIGHUP, обработчик) в свой блок.
Chouettou

3

ЗШ оболочка имеет возможность сделать все фоновые процессы запускаются с поЬир.

В ~/.zshrcдобавить следующие строки:

setopt nocheckjobs  #don't warn about bg processes on exit
setopt nohup        #don't kill bg processes on exit

Тогда вам просто нужно запустить такой процесс: python bgservice.py & и вам больше не нужно использовать команду nohup.

Я знаю, что не многие люди используют zsh, но это действительно классная оболочка, которую я бы порекомендовал.


1

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

supervisord - отличное готовое решение, которое можно использовать для демонстрации любого процесса. В нем есть еще одна управляющая утилита, supervisorctlкоторую можно использовать для мониторинга процессов, выполняемых супервизором.

Вам не нужно писать дополнительный код или изменять существующие сценарии, чтобы это работало. Более того, подробная документация значительно упрощает этот процесс.

После того, как я часами почесал голову вокруг python-daemon, супервизор - это решение, которое сработало для меня за считанные минуты.

Надеюсь, это поможет кому-то, кто пытается заставить работать python-daemon


1

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

Основное использование:

import yapdi

daemon = yapdi.Daemon()
retcode = daemon.daemonize()

# This would run in daemon mode; output is not visible
if retcode == yapdi.OPERATION_SUCCESSFUL:
print('Hello Daemon')

1

Попробуй это:

nohup python -u <your file name>.py >> <your log file>.log &

Вы можете запустить указанную выше команду на экране и выйти за пределы экрана.

Теперь вы можете отслеживать журналы своего скрипта Python: tail -f <your log file>.log

Чтобы убить ваш сценарий, вы можете использовать команды ps -aux и kill .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.