Как проверить работает ли программа на питоне

P ython — один из самых популярных языков программирования в мире. Он используется для разработки веб-сайтов, написания сценариев, машинного обучения, анализа данных и многого другого.

В этой статье объясняется, как проверить, какая версия Python установлена в вашей операционной системе с помощью командной строки. Это может быть полезно при установке приложений, написанных на Python, для которых требуется определенная версия Python.

Проверьте, работает ли python script

У меня есть демон python, запущенный как часть моего веб-приложения/Как я могу быстро проверить (используя python), если мой демон запущен, а если нет, запустите его?

Я хочу сделать это таким образом, чтобы исправить любые сбои демона, и поэтому script не нужно запускать вручную, он будет автоматически запускаться, как только он будет вызываться, а затем останется работать.

Как я могу проверить (используя python), если мой script запущен?

Лучший ответ:

Оставьте pidfile где-нибудь (например,/tmp). Затем вы можете проверить, работает ли процесс, проверяя, существует ли PID в файле. Не забудьте удалить файл, когда вы завершите работу, и проверьте его при запуске.

Как запустить Python IDLE и сделать первую программу (для новичков)


#/usr/bin/env python import os import sys pid = str(os.getpid()) pidfile = «/tmp/mydaemon.pid» if os.path.isfile(pidfile): print «%s already exists, exiting» % pidfile sys.exit() file(pidfile, ‘w’).write(pid) try: # Do some actual work here finally: os.unlink(pidfile)

Затем вы можете проверить, работает ли процесс, проверяя, является ли содержимое /tmp/mydaemon.pid существующим процессом. Monit (упомянутый выше) может сделать это для вас, или вы можете написать простую оболочку script, чтобы проверить ее для вас, используя код возврата из ps.

ps up `cat /tmp/mydaemon.pid ` >/dev/null echo «Running» || echo «Not running»

Для дополнительного кредита вы можете использовать модуль atexit, чтобы гарантировать, что ваша программа очистит свой pidfile при любых обстоятельствах (когда убиты, подняты исключения и т.д.).

Техника, которая удобна в системе Linux, использует доменные сокеты:

import socket import sys import time def get_lock(process_name): # Without holding a reference to our socket somewhere it gets garbage # collected when the function exits get_lock._lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) try: get_lock._lock_socket.bind(‘’ + process_name) print ‘I got the lock’ except socket.error: print ‘lock exists’ sys.exit() get_lock(‘running_test’) while True: time.sleep(3)

Это атомарное решение, позволяющее избежать проблем, связанных с блокировкой файлов, если ваш процесс отправляется SIGKILL

Вы можете прочитать в документации по socket.close что сокеты автоматически закрываются при сборке мусора.

Библиотека pid может сделать именно это.

from pid import PidFile with PidFile(): do_something()

Он также автоматически обрабатывает случай, когда существует файл pidfile, но процесс не запущен.

Вычисляем по IP с помощью Python | Как определить местоположение по IP

Есть очень хорошие пакеты для перезапуска процессов в UNIX. Тот, у которого есть большой учебник по его созданию и настройке, monit. С некоторой настройкой вы можете испытать солидную технологию, поддерживающую ваш демон.

Конечно, пример от Дэна не будет работать так, как должно быть.

В самом деле, если сбой script, появление исключения или очистка файла pid, script будет выполняться несколько раз.

Я предлагаю следующее на другом сайте:

Это проверить, существует ли уже существующий файл блокировки

#/usr/bin/env python import os import sys if os.access(os.path.expanduser(«~/.lockfile.vestibular.lock»), os.F_OK): #if the lockfile is already there then check the PID number #in the lock file pidfile = open(os.path.expanduser(«~/.lockfile.vestibular.lock»), «r») pidfile.seek(0) old_pid = pidfile.readline() # Now we check the PID from lock file matches to the current # process PID if os.path.exists(«/proc/%s» % old_pid): print «You already have an instance of the program running» print «It is running as process %s,» % old_pid sys.exit(1) else: print «File is there but the program is not running» print «Removing lock file for the: %s as it can be there because of the program last time it was run» % old_pid os.remove(os.path.expanduser(«~/.lockfile.vestibular.lock»))

Это часть кода, где мы помещаем PID файл в файл блокировки

pidfile = open(os.path.expanduser(«~/.lockfile.vestibular.lock»), «w») pidfile.write(«%s» % os.getpid()) pidfile.close()

Этот код проверяет значение pid по сравнению с существующим запущенным процессом., избегая двойного выполнения.

Надеюсь, это поможет.

Существует множество вариантов. Один из методов – использование системных вызовов или библиотек python, которые выполняют такие вызовы для вас. Другой – это просто создать такой процесс, как:

ps ax | grep processName

и проанализировать вывод. Многие люди выбирают этот подход, это не обязательно плохой подход на мой взгляд.

Попробуйте эту другую версию

def checkPidRunning(pid): »’Check For the existence of a unix pid. »’ try: os.kill(pid, 0) except OSError: return False else: return True # Entry point if __name__ == ‘__main__’: pid = str(os.getpid()) pidfile = os.path.join(«/», «tmp», __program__+».pid») if os.path.isfile(pidfile) and checkPidRunning(int(file(pidfile,’r’).readlines()[0])): print «%s already exists, exiting» % pidfile sys.exit() else: file(pidfile, ‘w’).write(pid) # Do some actual work here main() os.unlink(pidfile)

Я большой поклонник Supervisor для управления демонами. Он написан на Python, поэтому есть много примеров того, как взаимодействовать с Python или расширять его. Для ваших целей API-интерфейс управления XML-RPC должен работать хорошо.

Мое решение заключается в проверке аргументов процесса и командной строки. Протестировано на Windows и Ubuntu Linux.

Читайте также:
Лучшая программа на Айфон для скачивания

import psutil import os def is_running(script): for q in psutil.process_iter(): if q.name().startswith(‘python’): if len(q.cmdline())>1 and script in q.cmdline()[1] and q.pid !=os.getpid(): print(«‘<>’ Process is already running».format(script)) return True return False if not is_running(«test.py»): n = input(«What is Your Name? «) print («Hello » + n)

Прошел этот старый вопрос, ища решение самостоятельно.

import psutil import sys from subprocess import Popen for process in psutil.process_iter(): if process.cmdline() == [‘python’, ‘your_script.py’]: sys.exit(‘Process found: exiting.’) print(‘Process not found: starting it.’) Popen([‘python’, ‘your_script.py’])

Другие ответы отлично подходят для таких вещей, как задания cron, но если вы используете демон, вы должны отслеживать его с помощью daemontools.

ps ax | grep processName

если yor debug script в pycharm всегда выходит

pydevd.py —multiproc —client 127.0.0.1 —port 33882 —file processName

Вместо того, чтобы разрабатывать собственное решение PID файла (у которого больше тонкостей и угловых случаев, чем вы думаете), посмотрите supervisord – это система управления процессом, которая упрощает перенос управления заданиями и поведения демона вокруг существующего Python script.

#/usr/bin/env python import os, sys, atexit try: # Set PID file def set_pid_file(): pid = str(os.getpid()) f = open(‘myCode.pid’, ‘w’) f.write(pid) f.close() def goodby(): pid = str(‘myCode.pid’) os.remove(pid) atexit.register(goodby) set_pid_file() # Place your code here except KeyboardInterrupt: sys.exit(0)

Вот более полезный код (с проверкой, если именно python выполняет script):

#! /usr/bin/env python import os from sys import exit def checkPidRunning(pid): global script_name if pid
ps_command = «ps -o command= %s | grep -Eq ‘python .*/%s'» % (pid,script_name)

возвращает 0, если “grep” успешно, а процесс “python” в настоящее время запущен с именем вашего script в качестве параметра.

Простой пример, если вы ищете только имя процесса:

import os def pname_exists(inp): os.system(‘ps -ef > /tmp/psef’) lines=open(‘/tmp/psef’, ‘r’).read().split(‘n’) res=[i for i in lines if inp in i] return True if res else False Result: In [21]: pname_exists(‘syslog’) Out[21]: True In [22]: pname_exists(‘syslog_’) Out[22]: False

Рассмотрим следующий пример, чтобы решить вашу проблему:

#!/usr/bin/python # -*- coding: latin-1 -*- import os, sys, time, signal def termination_handler (signum,frame): global running global pidfile print ‘You have requested to terminate the application. ‘ sys.stdout.flush() running = 0 os.unlink(pidfile) running = 1 signal.signal(signal.SIGINT,termination_handler) pid = str(os.getpid()) pidfile = ‘/tmp/’+os.path.basename(__file__).split(‘.’)[0]+’.pid’ if os.path.isfile(pidfile): print «%s already exists, exiting» % pidfile sys.exit() else: file(pidfile, ‘w’).write(pid) # Do some actual work here while running: time.sleep(10)

Я предлагаю этот script, потому что он может быть выполнен только один раз.

Использование bash для поиска процесса с текущим именем script. Нет дополнительного файла.

import commands import os import time import sys def stop_if_already_running(): script_name = os.path.basename(__file__) l = commands.getstatusoutput(«ps aux | grep -e ‘%s’ | grep -v grep | awk »| awk »» % script_name) if l[1]: sys.exit(0);

Чтобы проверить, добавьте

stop_if_already_running() print «running normally» while True: time.sleep(3)

Вот что я использую в Linux, чтобы избежать запуска скрипта, если он уже запущен:

import os import sys script_name = os.path.basename(__file__) pidfile = os.path.join(«/tmp», os.path.splitext(script_name)[0]) + «.pid» def create_pidfile(): if os.path.exists(pidfile): with open(pidfile, «r») as _file: last_pid = int(_file.read()) # Checking if process is still running last_process_cmdline = «/proc/%d/cmdline» % last_pid if os.path.exists(last_process_cmdline): with open(last_process_cmdline, «r») as _file: cmdline = _file.read() if script_name in cmdline: raise Exception(«Script already running. «) with open(pidfile, «w») as _file: pid = str(os.getpid()) _file.write(pid) def main(): «»»Your application logic goes here»»» if __name__ == «__main__»: create_pidfile() main()

Этот подход хорошо работает без какой-либо зависимости от внешнего модуля.

Источник: techarks.ru

Проверьте, запущен ли скрипт Python

У меня есть демон python, запущенный как часть моего веб-приложения/Как я могу быстро проверить (используя python), если мой демон запущен, а если нет, запустите его? Я хочу сделать это таким образом, чтобы исправить любые сбои демона, и поэтому script не нужно запускать вручную, он будет автоматически запускаться, как только он будет вызываться, а затем останется работать. Как я могу проверить (используя python), если мой script запущен?

Josh Hunt 25 апр. 2009, в 09:27
Поделиться
Вы уверены, что не хотите, чтобы ваш процесс был написан на python?
ojblass 25 апр.

2009, в 07:18

Попробуйте Tendo, создайте единственный экземпляр вашего скрипта, поэтому скрипт не запустится, если он уже запущен. github.com/pycontribs/tendo

JasTonAChair 21 фев. 2016, в 07:54
Поделиться:

19 ответов

Лучший ответ

Оставьте pidfile где-нибудь (например,/tmp). Затем вы можете проверить, работает ли процесс, проверяя, существует ли PID в файле. Не забудьте удалить файл, когда вы завершите работу, и проверьте его при запуске.

#/usr/bin/env python import os import sys pid = str(os.getpid()) pidfile = «/tmp/mydaemon.pid» if os.path.isfile(pidfile): print «%s already exists, exiting» % pidfile sys.exit() file(pidfile, ‘w’).write(pid) try: # Do some actual work here finally: os.unlink(pidfile)

Затем вы можете проверить, работает ли процесс, проверяя, является ли содержимое /tmp/mydaemon.pid существующим процессом. Monit (упомянутый выше) может сделать это для вас, или вы можете написать простую оболочку script, чтобы проверить ее для вас, используя код возврата из ps.

ps up `cat /tmp/mydaemon.pid ` >/dev/null echo «Running» || echo «Not running»

Для дополнительного кредита вы можете использовать модуль atexit, чтобы гарантировать, что ваша программа очистит свой pidfile при любых обстоятельствах (когда убиты, подняты исключения и т.д.).

Читайте также:
Какие программы используются педагогом при организации

Dan Udey 25 апр. 2009, в 17:38
Поделиться
Забыли закрыть файл после записи PID?
ibz 12 июль 2010, в 04:58

Поскольку ссылка на файловый объект никогда не сохраняется, она не будет хранить счетчик ссылок после завершения вызова write (). Я не уверен, считается ли это Pythonic, но это работает довольно хорошо. В частности: объект будет выделен, вызван метод write (), а затем он будет немедленно освобожден, что закроет файл для вас.

Dan Udey 13 июль 2010, в 03:37

если программа прервалась, os.unlink () не будет выполняться, и программа не запустится снова, поскольку файл существует. право ?

Yuda Prawira 28 май 2011, в 17:00

Правильно, однако это может быть ожидаемым поведением. Если pid-файл существует, но PID внутри не запущен, это указывает на незаметное завершение работы, что означает сбой приложения. Это позволяет вам знать, что есть проблема, и проверять журналы. Как уже упоминалось, модуль atexit также может позаботиться об этом, предполагая, что ошибка не в самом интерпретаторе Python.

Dan Udey 30 май 2011, в 22:05

Хотя это простое решение, оно подвержено состоянию гонки. Если два экземпляра сценария выполняются примерно в одно и то же время, вполне возможно, что if os.path.isfile(pidfile) может принять значение false для обоих, в результате чего они оба if os.path.isfile(pidfile) файл блокировки и продолжат работу.

Cerin 10 май 2013, в 20:05
Пиды также используются операционной системой. Так что ложные срабатывания возможны.
aychedee 25 июнь 2013, в 16:35

Для тех, кто находит это сейчас, обратите внимание, что в python 3 file() был удален, и вы должны использовать open() . Кроме того, даже если вы используете версию 2.7, вы должны использовать open() вместо file() как описано здесь: docs.python.org/2/library/functions.html#file (и да, если вы использовали python обратно около 2.2, Официальный совет был обратным. Видимо, они передумали.)

jpk 16 авг. 2015, в 05:50
Показать ещё 5 комментариев

Техника, которая удобна в системе Linux, использует доменные сокеты:

import socket import sys import time def get_lock(process_name): # Without holding a reference to our socket somewhere it gets garbage # collected when the function exits get_lock._lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) try: get_lock._lock_socket.bind(‘’ + process_name) print ‘I got the lock’ except socket.error: print ‘lock exists’ sys.exit() get_lock(‘running_test’) while True: time.sleep(3)

Это атомарное решение, позволяющее избежать проблем, связанных с блокировкой файлов, если ваш процесс отправляется SIGKILL

Вы можете прочитать в документации по socket.close что сокеты автоматически закрываются при сборке мусора.

aychedee 13 окт. 2011, в 17:55
Поделиться

Примечание для будущих гуглеров: в этом коде используются «абстрактные сокеты», специфичные для Linux (в общем, не posix). Подробнее об этом: blog.eduardofleury.com/archives/2007/09/13

georg 01 нояб. 2012, в 17:50
Я исправлю ответ, извините! Думал, что они были posix.
aychedee 01 нояб. 2012, в 21:47
Это потрясающе, и не оставляет глупых файлов. Хотелось бы, чтобы я проголосовал за это больше.

Hiro2k 22 май 2013, в 21:20
Это спасло мне жизнь! Спасибо!
JoseP 23 май 2013, в 14:18

Потрясающие. Но мне интересно, почему lock_socket определяется глобально. Я проверил, и если lock_socket не определен как глобальный, система блокировки не работает при запуске нескольких процессов. Зачем? lock_socket определен и используется только в функции get_lock. Почему это должно быть определено глобально?

Alptugay 09 янв. 2014, в 08:37

Прошло много времени с тех пор, как я написал это . и моя память туманна. Но я думаю, что это потому, что он собирает мусор, а сокет закрывается в противном случае. Что-то вроде того.

aychedee 09 янв. 2014, в 09:14
user443854 01 авг. 2014, в 00:39
Извините user443854, это только Linux. Смотрите самое первое предложение ответа.
aychedee 01 авг. 2014, в 04:24

Это великолепно. Как раз то, что я искал. Спасибо!
Amal Murali 01 сен. 2014, в 15:40
Почему бы не использовать POSIX-сокеты?

Почему требуются абстрактные сокеты?
Justin M. Keyes 11 авг. 2015, в 17:28

Вы имеете в виду использование сокета в пространстве имен файловой системы? Что-то вроде socket.bind(‘/tmp/socky) ? Когда я вызываю close на этом сокете, файл все еще остается, и я не могу привязать другой сокет к тому же месту. Делать это немного бесполезным с целью блокировки .

aychedee 14 авг. 2015, в 09:21
Хотя, если вы хотите сделать это, вы всегда можете добавить какой-нибудь код очистки, я думаю?
aychedee 14 авг. 2015, в 09:26

Вы можете использовать def get_lock(process_name, lock_socket=socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)): вместо global .

jfs 26 апр. 2016, в 07:52

Вы действительно проверяли этот код? Есть причина для использования global . Изменилась ли среда исполнения Python в последнее время? Это Питон 3?

aychedee 26 апр. 2016, в 08:00
«0» имеет какое-то особое значение? Благодарю.
secfree 11 июль 2016, в 07:15

Нулевой байт ( ) означает, что сокет создается в абстрактном пространстве имен, а не в самой файловой системе.

aychedee 11 июль 2016, в 07:26
spectras 06 сен. 2016, в 11:41

Читайте также:
Топ хлоп малыши а буренина т сауко программа

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

aychedee 06 сен. 2016, в 13:48

Легко ответить на вопрос моего новичка, но почему бы просто не проверить, работает ли конкретный сценарий python «xxx.py», работающий с использованием Popen([‘pidof’,»xxx.py») ?

Max Segal 14 нояб. 2016, в 11:30

Вы могли бы сделать это . но что, если вы хотите изменить имя вашего сценария? Или, что более важно, что, если две копии сценария были запущены одновременно? Я вполне уверен, что если бы мне удалось правильно выбрать время, я мог бы запустить оба из них, не осознавая, что другое тоже началось. Этот механизм блокировки файлов является атомарным. Это означает, что его нельзя схватить двумя разными процессами.

aychedee 14 нояб. 2016, в 15:48

Кажется, это работает только для меня с перерывами. Иногда, даже после закрытия сценария и ожидания ~ 1-2 минут, сценарий все равно будет содержать блокировку процесса, и 2-й экземпляр не может быть запущен. Есть ли способ обойти это или заставить GC делать свое дело? Я смог выполнить сценарий снова во второй раз, обновив значение параметра process_name, но есть ли лучший способ сделать это? Мне нравится это чистое решение, и я не хочу переходить на использование ps -ef, чтобы проверить, является ли это единственным стабильным способом сделать это

AK47 10 авг. 2017, в 15:48

unix.stackexchange.com/questions/216784/… — это работает для меня . Я должен предположить, что что-то на самом деле является ссылкой на сокет вокруг. Мой абстрактный сокет исчезает мгновенно, когда скрипт завершает работу, или он ловит SIGKILL. Действительно ли завершился процесс Python? Это было бы, где я бы расследовал.

aychedee 11 авг. 2017, в 07:55

есть ли способ снять блокировку? Потому что я продолжаю выходить из программы из-за некоторых работающих сокетов ..

Avinash Raj 28 март 2018, в 13:38
Показать ещё 21 комментарий

Библиотека pid может сделать именно это.

from pid import PidFile with PidFile(): do_something()

Он также автоматически обрабатывает случай, когда существует файл pidfile, но процесс не запущен.

Decko 09 окт. 2015, в 18:44
Поделиться

Это работает КРАСИВО. Он просто должен быть запущен от имени пользователя root для запуска в Ubuntu. +1

Jimmy 31 окт. 2015, в 14:57
Decko 03 нояб. 2015, в 15:31
эта библиотека прекрасно работает !!
nguaman 22 янв. 2017, в 23:37
bgth 02 дек.

2017, в 00:28
Не работает на винде
DonkeyKong 10 окт. 2018, в 14:10
Показать ещё 3 комментария

Конечно, пример от Дэна не будет работать так, как должно быть.

В самом деле, если сбой script, появление исключения или очистка файла pid, script будет выполняться несколько раз.

Я предлагаю следующее на другом сайте:

Это проверить, существует ли уже существующий файл блокировки

#/usr/bin/env python import os import sys if os.access(os.path.expanduser(«~/.lockfile.vestibular.lock»), os.F_OK): #if the lockfile is already there then check the PID number #in the lock file pidfile = open(os.path.expanduser(«~/.lockfile.vestibular.lock»), «r») pidfile.seek(0) old_pid = pidfile.readline() # Now we check the PID from lock file matches to the current # process PID if os.path.exists(«/proc/%s» % old_pid): print «You already have an instance of the program running» print «It is running as process %s,» % old_pid sys.exit(1) else: print «File is there but the program is not running» print «Removing lock file for the: %s as it can be there because of the program last time it was run» % old_pid os.remove(os.path.expanduser(«~/.lockfile.vestibular.lock»))

Это часть кода, где мы помещаем PID файл в файл блокировки

pidfile = open(os.path.expanduser(«~/.lockfile.vestibular.lock»), «w») pidfile.write(«%s» % os.getpid()) pidfile.close()

Этот код проверяет значение pid по сравнению с существующим запущенным процессом., избегая двойного выполнения.

Надеюсь, это поможет.

Shylock 27 нояб. 2010, в 11:48
Поделиться

Следует использовать os.kill(old_pid, 0) , который должен быть более переносимым в UNIX. Это вызовет OSError если такой PID отсутствует или он принадлежит другому пользователю.

drdaeman 16 дек. 2011, в 22:01

Имейте в виду, что использование / proc / для проверки процесса чрезвычайно непереносимо и будет надежно работать только в Linux.

Dan Udey 14 май 2015, в 22:17

Есть очень хорошие пакеты для перезапуска процессов в UNIX. Тот, у которого есть большой учебник по его созданию и настройке, monit. С некоторой настройкой вы можете испытать солидную технологию, поддерживающую ваш демон.

ojblass 25 апр. 2009, в 09:14
Поделиться

Я согласен, не изобретайте колесо, есть множество способов демонизировать ваше приложение, включая его перезапуск, если оно умирает, запуск, если он не запущен, и т. Д. И т. Д.

davr 25 апр. 2009, в 07:47

Существует множество вариантов. Один из методов — использование системных вызовов или библиотек python, которые выполняют такие вызовы для вас. Другой — это просто создать такой процесс, как:

ps ax | grep processName

и проанализировать вывод. Многие люди выбирают этот подход, это не обязательно плохой подход на мой взгляд.

Источник: overcoder.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru