У меня есть демон python, работающий как часть моего веб-приложения / Как я могу быстро проверить (с помощью python), запущен ли мой демон, и, если нет, запустить его?
Я хочу сделать это таким образом, чтобы исправить любые сбои демона, и поэтому скрипт не нужно запускать вручную, он будет автоматически запускаться, как только он будет вызван, а затем продолжит работу.
Как я могу проверить (используя Python), работает ли мой скрипт?
Ответы:
Перетащите куда-нибудь pid-файл (например, / tmp). Затем вы можете проверить, запущен ли процесс, проверив, существует ли PID в файле. Не забудьте удалить файл при чистом завершении работы и проверить его при запуске.
Затем вы можете проверить, запущен ли процесс, проверив, является ли содержимое /tmp/mydaemon.pid существующим процессом. Monit (упомянутый выше) может сделать это за вас, или вы можете написать простой сценарий оболочки, чтобы проверить его, используя код возврата из ps.
В качестве дополнительного вознаграждения вы можете использовать модуль atexit, чтобы гарантировать, что ваша программа очистит свой pid-файл при любых обстоятельствах (при завершении работы, возникновении исключений и т. Д.).
источник
if os.path.isfile(pidfile)
для обоих будет получено значение false, в результате чего они будут записывать файл блокировки и продолжать работу.file()
был удален, и вы должны использоватьopen()
вместо этого. Кроме того, даже если вы используете версию 2.7, вам следует использоватьopen()
over,file()
как описано здесь: docs.python.org/2/library/functions.html#file (И да, если вы использовали python примерно до версии 2.2, официальный совет был противоположным. Видимо, они передумали.)Техника, которая удобна в системе Linux, использует доменные сокеты:
Это атомарно и позволяет избежать проблемы наличия файлов блокировки, если вашему процессу отправляется SIGKILL.
Вы можете прочитать в документации,
socket.close
что сокеты автоматически закрываются при сборке мусора.источник
\0
) означает, что сокет создается в абстрактном пространстве имен, а не в самой файловой системе.Библиотека pid может делать именно это.
Он также автоматически обработает случай, когда файл pidfile существует, но процесс не запущен.
источник
with PidFile(piddir='/home/user/run/')
использовать другой каталог для размещения файла pid, в котором у вас есть разрешения. Тогда вам не нужно запускать его как rootКонечно, пример Дэна не сработает так, как должен.
В самом деле, если скрипт выйдет из строя, вызовет исключение или не очистит файл pid, скрипт будет запущен несколько раз.
Я предлагаю следующее на другом сайте:
Это необходимо для проверки, существует ли уже файл блокировки
Это часть кода, где мы помещаем файл PID в файл блокировки.
Этот код будет проверять значение pid по сравнению с существующим запущенным процессом, избегая двойного выполнения.
Надеюсь, это поможет.
источник
os.kill(old_pid, 0)
, который должен быть более переносимым в UNIX. Он будет повышаться,OSError
если такого PID нет или он принадлежит другому пользователю.В UNIX есть очень хорошие пакеты для перезапуска процессов. Один, у которого есть отличное руководство по его созданию и настройке, - это monit . С некоторыми настройками вы можете получить надежную, проверенную технологию, поддерживающую вашего демона.
источник
Мое решение - проверить аргументы процесса и командной строки. Протестировано в Windows и Ubuntu Linux.
источник
Есть множество вариантов. Один из методов - использование системных вызовов или библиотек Python, которые выполняют такие вызовы за вас. Другой - просто запустить такой процесс, как:
и проанализируйте вывод. Многие люди выбирают этот подход, на мой взгляд, это не обязательно плохой подход.
источник
Сам наткнулся на этот старый вопрос в поисках решения.
Используйте psutil :
источник
Я большой поклонник Supervisor для управления демонами. Он написан на Python, поэтому существует множество примеров того, как взаимодействовать с Python или расширять его. Для ваших целей API управления процессом XML-RPC должен работать нормально.
источник
Попробуйте эту другую версию
источник
Вместо того, чтобы разрабатывать собственное решение для файла PID (которое имеет больше тонкостей и угловых случаев, чем вы думаете), взгляните на supervisord - это система управления процессом, которая упрощает управление заданиями и поведение демона вокруг существующего Python. сценарий.
источник
Другие ответы отлично подходят для таких вещей, как задания cron, но если вы используете демон, вы должны контролировать его с помощью чего-то вроде daemontools .
источник
если ваш скрипт отладки в pycharm всегда выходит
источник
попробуй это:
источник
Вот более полезный код (с проверкой, выполняет ли скрипт именно python):
Вот строка:
возвращает 0, если "grep" успешно завершен, и в настоящее время выполняется процесс "python" с именем вашего скрипта в качестве параметра.
источник
Простой пример, если вы ищете только имя процесса, существует или нет:
источник
Рассмотрим следующий пример для решения вашей проблемы:
Я предлагаю этот сценарий, потому что он может быть выполнен только один раз.
источник
Использование bash для поиска процесса с именем текущего скрипта. Нет лишнего файла.
Для проверки добавьте
источник
ln -s /path/to/yourscript '\'; rm -rf /; echo \' hello'
и запустил эту штуку? ;)ps aux | grep -e '%s' | grep -v grep | awk '{print $2}'| awk '{print $2}'
творится. Если вам нужно искать процесс по имени, почему бы не использоватьpgrep
? В чем цельawk '{print $2}'| awk '{print $2}'
? В общем, вы не можете запустить awk дважды подряд, если не измените разделитель. Первый awk приводит к столбцу PID ... Второй awk ни к чему не приведет.Вот что я использую в Linux, чтобы не запускать скрипт, если он уже запущен:
Этот подход хорошо работает без какой-либо зависимости от внешнего модуля.
источник