Как запустить скрипт Python в фоновом режиме даже после выхода из системы SSH? - PullRequest
98 голосов
/ 04 июня 2010

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

Ответы [ 8 ]

188 голосов
/ 04 июня 2010

Запустите nohup python bgservice.py &, чтобы скрипт игнорировал сигнал зависания и продолжал работать. Выходные данные будут помещены в nohup.out.

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

27 голосов
/ 04 июня 2010

Если вы уже запустили процесс и не хотите его завершать и перезапускать в nohup, вы можете отправить его в фоновый режим, а затем отказаться от него.

Ctrl+Z (приостановить процесс)

bg (перезапустить процесс в фоновом режиме

disown %1 (при условии, что это задание № 1, используйте jobs для определения)

16 голосов
/ 04 июня 2010

Вы также можете использовать экран GNU , который должен иметься почти в каждой системе Linux / Unix.

Если вы работаете в Ubuntu / Debian, его улучшенный вариант byobu тоже довольно хорош.

10 голосов
/ 29 февраля 2012

Возможно, вы захотите превратить ваш скрипт на python в правильного демона python, как описано здесь .

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

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

6 голосов
/ 04 июня 2010

Вы можете ничего не делать, но я предпочитаю screen .

5 голосов
/ 18 января 2017

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

3 голосов
/ 04 июня 2010

Оболочка zsh имеет возможность запускать все фоновые процессы с помощью nohup.

В ~/.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 голос
/ 11 октября 2016

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...