У вас есть скрипт, с помощью которого вы получаете данные каждый день. Например из API яндекс директ или google analytics. Вы хотите автоматизировать это действие, вам надоело вручную каждый день запускать скрипт. Для этого в linux есть планировщик задач cron.
Cron — это сервис, как и большинство других сервисов Linux, он запускается при старте системы и работает в фоновом режиме. Его основная задача выполнять нужные процессы в нужное время. Регулярные действия описываются инструкциями, помещенными в файлы crontab и в специальные директории.
Для того, чтобы отредактировать файл crontab нужно ввести в консоль команду
Источник: toolmark.ru
Как автоматически перезапустить скрипт Python, если он был убит или умер
Я запускаю свой сценарий Python в фоновом режиме на моем компьютере с Ubuntu (12.04) следующим образом:
Как сделать автозапуск программ на Python по расписанию
nohup python testing.py > test.out Hello World» time.sleep(5)
В Ubuntu (до 14.04, 16.04 и позже используйте systemd) можно использовать upstart для этого лучше, чем задание cron. Вы вводите настройки конфигурации /etc/init и убедитесь, что вы задаете респаун
Это может быть минимальный файл /etc/init/testing.conf (отредактируйте как root ):
chdir /your/base/directory exec python testing.py respawn
И вы можете проверить с /your/base/directory/testing.py :
from __future__ import print_function import time with open(‘/var/tmp/testing.log’, ‘a’) as fp: print(time.time(), ‘done’, file=fp) time.sleep(3)
sudo start testing
и следите за тем, что происходит (в другом окне), с помощью:
tail -f /var/tmp/testing.log
и остановитесь на:
sudo stop testing
Вы также можете добавить [start on][2] команду запуска при загрузке системы.
Если вы используете задание cron, вам нужно либо внедрить, либо найти какой-то код для надежной обработки PID-файлов. Вы хотите, чтобы ваша служба / script / daemon создала PID-файл (условно расположенный в / var / run) и чтобы его стартовый код проверял, не устарело ли содержимое файла (оставленное уничтоженным процессом). Этот вид кода на удивление трудно написать без рас и угловых случаев. stackoverflow.com/questions/788411/…
Спасибо, Зельда. Благодарим Вас за помощь. Я обновил вопрос с некоторыми деталями. Я пытаюсь сделать так, чтобы увидеть, запущен ли мой testing.py или нет .. Он не показывает мне, работает он или нет .. px ax | grep testing.py .. Он мне ничего не возвращает? Есть идеи почему?
Вы должны поместить все это в предложение try / исключением и записать в файл журнала, какое исключение было сгенерировано и что программа закрывается. Возможно, оператор print не работает, так как не может записать в stdout.
Вы также можете использовать более ориентированный на оболочку подход. Найдите свой cron сценарий и перезапустите его, если он умрет.
Автозапуск программ на python
- Создайте новый crontab, запустив crontab -e . Откроется окно вашего любимого текстового редактора.
- Добавьте эту строку в файл, который только что открылся
*/5 * * * * pgrep -f testing.py || nohup python /home/you/scripts/testing.py > test.out
Вы только что создали новый, crontab который будет запускаться каждые 5 минут и запускать ваш скрипт, если он еще не запущен. Смотрите здесь для милого небольшого урока cron . Официальные документы по Ubuntu cron находятся здесь .
Фактическая команда, pgrep которая выполняется, выполняет поиск запущенных процессов для строки, заданной в командной строке. pgrep foo будет искать названную программу foo и вернуть ее идентификатор процесса . pgrep -f позволяет выполнять поиск по всей командной строке, используемой для запуска программы, а не только по имени программы (полезно, потому что это скрипт на python).
В || означает символ «это сделать , если предыдущая команда не удалось». Итак, если ваш скрипт не запущен, pgrep произойдет сбой, поскольку он ничего не найдет и ваш скрипт будет запущен.
Спасибо .. Но я новичок в Linux и Unix, так что не знаете, где находится crontab? Это файл в моей машине с Ubuntu?
Спасибо Terdon .. Я могу запустить эту команду crontab -e из каталога, где мой скрипт Python .. Правильно?
Спасибо. Теперь это имеет смысл . Я только что создал новый crontab и отредактировал файл, добавив одну и ту же строку, но в течение 1 минуты . Я уже создал скрипт Hello World Python, вращающийся вокруг, в то время как True назван test.py .. После сохранения файл crontab, он должен автоматически запускать testing.py через 1 минуту? И затем продолжайте проверять каждую минуту, работает ли скрипт Python или нет? Если да, после сохранения файла crontab -e я сделал ps ax | grep testing.py и я не могу увидеть какой-либо процесс для этого?
Вы можете заставить тестирующую программу перенаправить вывод, используя параметр командной строки, а затем использовать простой скрипт на python, чтобы перезапустить программу на неопределенный срок:
import subprocess while True: try: print subprocess.check_output([‘python’, ‘testing.py’]) except KeyboardInterrupt: break
Вы можете поместить эту программу в фоновом режиме, и как только вы захотите остановить ее, просто вытяните ее на передний план и убейте ее.
Вы не должны действительно использовать это для производства, но вы могли бы:
#!/bin/sh while true; do nohup python testing.py >> test.out done респавна» в / 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.
Monit — это утилита с открытым исходным кодом для управления и мониторинга процессов, программ, файлов, каталогов и файловых систем в системе UNIX. Монит проводит автоматическое обслуживание и ремонт и может выполнять значимые причинно-следственные действия в ситуациях ошибки.
Вот пример для вашего сценария:
check process myprocessname matching «myprocessname» start program = «nohup /usr/bin/python /path/testing.py > /tmp/test.out stop program = «/usr/bin/killall myprocessname»
Источник: qastack.ru
Русские Блоги
Используйте скрипт оболочки для управления Python для автоматического перезапуска
Нам часто нужно запускать несколько сценариев Python в фоновом режиме, чтобы контролировать систему или сделать что-то еще; но из-за различных проблем, это не код сценария Python; сценарий будет его повесить. Ручной перезапуск нереально, и ожидается, что он будет перезапущен выше каждый день. Отказ Отказ
Таким образом, мы написали сценарий Shell для управления автоматическим перезапуском после того, как Python Hang:
Сценарий оболочки выглядит следующим образом: очень просто:
Затем мы используем сценарий Shell для запуска программы Python: после запуска: давайте тестируем:
Убейте процесс Python на заднем плане -9; см. Сценарий Python автоматически перезапускается.
Источник: russianblogs.com