Я запускаю свой сценарий Python в фоновом режиме на моем компьютере с Ubuntu (12.04) следующим образом:
nohup python testing.py > test.out &
Теперь может быть возможно, что на каком-то этапе мой выше Python script
может умереть по любой причине.
Так что я думаю иметь какой-то cron agent
скрипт в bash shell, который может автоматически перезапустить мой вышеописанный скрипт на Python, если он по какой-либо причине будет убит
Возможно ли это сделать? Если да, то как лучше всего решить эту проблему?
ОБНОВИТЬ:
После создания testing.conf
файла, как это -
chdir /tekooz
exec python testing.py
respawn
Я запустил команду sudo, чтобы запустить ее, но я не вижу, как этот процесс выполняется с использованием ps ax?
root@bx13:/bezook# sudo start testing
testing start/running, process 27794
root@bx13:/bezook# ps ax | grep testing.py
27806 pts/3 S+ 0:00 grep --color=auto testing.py
Есть идеи, почему px axe мне ничего не показывает? И как я могу проверить, работает ли моя программа или нет?
Это мой скрипт на Python -
#!/usr/bin/python
while True:
print "Hello World"
time.sleep(5)
/etc/init
файл? Если вы можете предоставить пошаговое руководство для меня, тогда я смогу чему-то научиться и делать правильные вещи ..sys.stdout = open(file_name, 'w')
в начале.px ax | grep testing.py
.. Он мне ничего не возвращает? Есть идеи почему?Вы также можете использовать более ориентированный на оболочку подход. Найдите свой
cron
сценарий и перезапустите его, если он умрет.Создайте новый crontab, запустив
crontab -e
. Откроется окно вашего любимого текстового редактора.Добавьте эту строку в файл, который только что открылся
Сохраните файл и выйдите из редактора.
Вы только что создали новый,
crontab
который будет запускаться каждые 5 минут и запускать ваш скрипт, если он еще не запущен. Смотрите здесь для милого небольшого урокаcron
. Официальные документы по Ubuntucron
находятся здесь .Фактическая команда,
pgrep
которая выполняется, выполняет поиск запущенных процессов для строки, заданной в командной строке.pgrep foo
будет искать названную программуfoo
и вернуть ее идентификатор процесса .pgrep -f
позволяет выполнять поиск по всей командной строке, используемой для запуска программы, а не только по имени программы (полезно, потому что это скрипт на python).В
||
означает символ «это сделать , если предыдущая команда не удалось». Итак, если ваш скрипт не запущен,pgrep
произойдет сбой, поскольку он ничего не найдет и ваш скрипт будет запущен.источник
crontab -e
из каталога, где мой скрипт Python .. Правильно?cron
это демон планирования, это служба, которая работает в фоновом режиме. Если ваш скрипт на python отсутствует$PATH
(если вы не можете запустить его из любого места, но вам нужно находиться в его каталоге), используйте полный путь к скрипту, как в моем обновленном ответе.Вы можете заставить тестирующую программу перенаправить вывод, используя параметр командной строки, а затем использовать простой скрипт на python, чтобы перезапустить программу на неопределенный срок:
Вы можете поместить эту программу в фоновом режиме, и как только вы захотите остановить ее, просто вытяните ее на передний план и убейте ее.
источник
Вы не должны действительно использовать это для производства, но вы могли бы:
Если по какой-либо причине процесс python завершается, цикл оболочки продолжится и перезапустит его, добавив его в
.out
файл по желанию. Почти нет накладных расходов и занимает очень мало времени на настройку.источник
Существует несколько способов мониторинга и повторного запуска процессов в UNIX / Linux. Одна из самых старых - это запись "респавна" в / etc / inittab ... если вы используете старую систему инициализации SysV. Другой метод - использовать демон supervisor из пакета daemontools DJ Bernstein . Другие варианты - использовать функции в Ubuntu Upstart ... или Systemd или других.
Но вы можете посмотреть на альтернативы init и в коде Python для Pardus: в частности, mudur daemon.
Если вы решите пойти с заданием cron (и обработкой файла PID), подумайте о том, чтобы прочитать этот PEP 3143 и, возможно, использовать его эталонную реализацию.
Как я упоминал в других моих комментариях, надежная обработка PID-файлов является сложной задачей. Это склонно к гонкам и угловым случаям. Это становится сложнее, если есть какой-либо шанс, что ваш файл PID окажется в NFS или другой сетевой файловой системе (некоторая атомарность гарантирует, что вы получите с семантикой обработки файлов в надлежащих локальных файловых системах UNIX / Linux, которые исчезнут в некоторых версиях и реализациях NFS, например). Также семантика вокруг блокировки файлов в UNIX может быть сложной. (Быстро ли снимается блокировка
flock
илиfcntl
блокировка в вашей целевой ОС, например, когда процесс, удерживающий ее, уничтожается с помощью SIGKILL?).источник
Вы также можете использовать мониторинг Monit Or Process с помощью ps-watcher.
Вот пример для вашего сценария:
Взгляните на примеры Монит
источник
Вам нужен руководитель, вы можете использовать руководителя . Это основанный на Python супервизор, поэтому его легко изменить, если вам нужно.
Управление осуществляется с помощью файлов с синтаксисом .ini.
источник
Ответ Тердона не сработал для меня, потому что
pgrep -f testing.py
никогда не « терпел неудачу». Было бы получить pid для задания cron (из-за опции -f). Однако без опции -f pgrep не найдет test.py, потому что нет процесса с именем test.py.Моим решением этого было изменить
в
это означает, что полная работа crontab будет такой:
источник
В моем случае, как быстрое исправление, я хотел, чтобы моя программа работала, когда она выходила с ошибкой en или она была убита. С другой стороны, я хотел остановить выполнение, когда программа завершилась правильно (код возврата = 0)
Я проверил это на Bash. Он должен нормально работать в любой другой оболочке
источник
Для ответа Тердона,
pgrep -f testing.py
никогда не вернется false в соответствии с комментариями здесь :Ответ Мэтта
pgrep -f testing.py
бесполезен, посколькуpgrep python
соответствует любому запущенному скрипту Python. Так что если два сценария Python cronjob, второй cronjob никогда не запустится.И тогда я нашел решение, чтобы решить
pgrep -f testing.py
в комментарии здесь: https://askubuntu.com/questions/1014559/running-pgrep-in-a-crontab?noredirect=1&lq=1Мой cron для запуска двух скриптов Python:
источник