У меня есть Python script bgservice.py
, и я хочу, чтобы он работал все время, потому что он является частью веб-службы, которую я создаю. Как я могу заставить его работать непрерывно даже после выхода из системы SSH?
Как запустить Python script в фоновом режиме даже после выхода из системы 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')
Ответ 10
Этот другой поток может быть полезен, чтобы решить, использовать ли nohup или disown:
https://unix.stackexchange.com/info/3886/difference-between-nohup-disown-and