Как определить, работает ли мой скрипт на Python? - PullRequest
1 голос
/ 04 марта 2012

У меня установлен скрипт Python для запуска из cron в Ubuntu Server. Однако это может занять больше времени, прежде чем другое событие cron попытается его запустить. Я хотел бы определить такой случай из самого скрипта и, если он запущен, изящно прекратить его из скрипта Python.

Ответы [ 3 ]

1 голос
/ 04 марта 2012

Сохраните свой pid в файл;если файл уже существует, проверьте, что процесс, который оставил свой PID, все еще жив.(Это безопаснее, чем пытаться гарантировать, что всегда удалит файл: вы не можете).Полный процесс выглядит следующим образом:

Проверьте, существует ли файл контрольных точек.Если этого не произойдет, запишите свой PID в файл и продолжите вычисления.

Если файл существует: прочитайте PID и проверьте, действительно ли процесс еще жив.Лучший способ сделать это с помощью kill -0 (из python: os.kill), которое не мешает выполнению процесса, но завершается неудачей, если его не существует.Если процесс все еще выполняется, выйдите.В противном случае запишите свой PID в файл и т. Д.

Существует небольшая вероятность возникновения состояния гонки, но если ваш процесс перезапускается с нечастыми интервалами, это должно быть совершенно безвредным: ваш процесс всегда может выйти в пользузапущенный процесс, который завершается через секунду, так что имеет значение, если запущенный процесс удастся завершить первым?

0 голосов
/ 04 марта 2012

Одно простое и эффективное решение - сделать что-то вроде этого в вашей записи в crontab:

ps -C myscript.py > /dev/null || /path/to/myscript.py
0 голосов
/ 04 марта 2012

Есть два очевидных решения:

  1. Какой-то файл блокировки, который он проверяет. Если файл блокировки существует, не запускайте его, в противном случае создайте его. (Или, точнее, в истинном Python стиле «просить прощения, а не разрешения», попробуйте сделать это и поймать ошибку, если она существует - остановка состояния гонки). Вы должны быть осторожны, чтобы гарантировать, что это будет очищено, когда сценарий завершится, однако - даже при ошибках, иначе это могло бы заблокировать будущие запуски. Традиционно это .pid файл, который содержит идентификатор процесса запущенного процесса.

  2. Используйте ps, чтобы проверить запущенный процесс. Однако с этим решением сложнее остановить состояние гонки.

...