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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

В 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, но это действительно классная оболочка, которую я бы рекомендовал.

Ответ 8

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

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

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

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

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

Ответ 9

Вы также можете использовать 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')