Ответы:
Выполните, nohup python bgservice.py &
чтобы сценарий игнорировал сигнал зависания и продолжал работу. Вывод будет вставлен nohup.out
.
В идеале вы должны запускать свой скрипт с чем-то вроде, supervise
чтобы его можно было перезапустить, если (когда) он умрет.
somecommand &
он напечатает pid как [1] 12345
. в противном случае вы можете использовать $!
.
Если вы уже запустили процесс и не хотите его останавливать и перезапускать под nohup, вы можете отправить его в фоновый режим, а затем отказаться от него.
Ctrl+Z
(приостановить процесс)
bg
(перезапустить процесс в фоновом режиме
disown %1
(при условии, что это работа №1, используйте jobs
для определения)
Вы также можете использовать экран GNU, который должен быть почти в каждой системе Linux / Unix.
Если вы используете Ubuntu / Debian, его расширенный вариант byobu тоже неплох .
Вы можете подумать о том, чтобы превратить ваш скрипт python в полноценный демон python, как описано здесь .
python-daemon - хороший инструмент, который можно использовать для запуска сценариев python в качестве фонового процесса демона, а не постоянно работающего сценария. Вам нужно будет немного изменить существующий код, но он прост и понятен.
Если вы столкнулись с проблемами с python-daemon, есть другой супервизор утилит , который сделает то же самое для вас, но в этом случае вам не придется писать какой-либо код (или изменять существующий), поскольку это готовое решение для демонизации процессы.
Вы не можете этого сделать, но я предпочитаю экран .
Вот простое решение внутри 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
.
ЗШ оболочка имеет возможность сделать все фоновые процессы запускаются с поЬир.
В ~/.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, но это действительно классная оболочка, которую я бы порекомендовал.
Если вам нужно, чтобы процесс работал вечно, независимо от того, вошли вы в систему или нет, рассмотрите возможность запуска процесса как демона.
supervisord - отличное готовое решение, которое можно использовать для демонстрации любого процесса. В нем есть еще одна управляющая утилита, supervisorctl
которую можно использовать для мониторинга процессов, выполняемых супервизором.
Вам не нужно писать дополнительный код или изменять существующие сценарии, чтобы это работало. Более того, подробная документация значительно упрощает этот процесс.
После того, как я часами почесал голову вокруг python-daemon, супервизор - это решение, которое сработало для меня за считанные минуты.
Надеюсь, это поможет кому-то, кто пытается заставить работать python-daemon
Вы также можете использовать 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')
Попробуй это:
nohup python -u <your file name>.py >> <your log file>.log &
Вы можете запустить указанную выше команду на экране и выйти за пределы экрана.
Теперь вы можете отслеживать журналы своего скрипта Python: tail -f <your log file>.log
Чтобы убить ваш сценарий, вы можете использовать команды ps -aux и kill .
nohup: ignoring in put and appending output to
nohup.out '', и когда я нажимаю клавишу ввода, процесс завершается со статусом 1. Что происходит?