Як запустити сценарій Python у фоновому режимі навіть після виходу з SSH?


110

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

Відповіді:


213

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

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


15
коли я запускаю команду з nohup і &, я отримую повідомлення nohup: ignoring in put and appending output to nohup.out'`, а коли натискаю клавішу enter, процес завершується зі статусом 1. Що відбувається?
Santosh Ghimire

1
читати вихід у nohup.out. в моєму випадку це була проблема дозволів, мені потрібно було використовувати sudo
mxns

і як зупинити bgservice після запуску цього методу?
вогонь у норі

1
@Shaegorath збережіть pid кудись, щоб ви могли надсилати сигнали до процесу пізніше. у деяких оболонках (bash, zsh тощо) після того, як ви somecommand &це зробите, він надрукує pid, як [1] 12345. інакше можна використовувати $!.
Тоні Бета-лямбда

31

Якщо ви вже запустили процес і не хочете його вбивати і перезапустити під нохупом, ви можете надіслати його на другий план, а потім відключити його.

Ctrl+Z (призупинити процес)

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

disown %1(припустимо, що це робота №1, використовуйте jobsдля визначення)



12

Ви можете розглянути можливість перетворення сценарію python у належний демон python, як описано тут .

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

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


дати коротке пояснення про те, як можна вирішити проблему, як правило, хороша ідея.
Нікхіл Саху


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яка може використовуватися для моніторингу процесів, якими керує керівник.

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

Після того, як годинами чухати голову навколо пітона-демона, супервізор - це рішення, яке працювало на мене за лічені хвилини.

Сподіваюсь, це допомагає комусь, хто намагається змусити пітон-демона працювати


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.