Форум сайта python.su
186
> в случае сбоя питания есть вероятность отличная от нуля, что в перезапущеной системе другой процесс получит PID который записан в вашем файле.
Ну можно проверять не только на PID, но ещё и на python.
> Ну и опять же если запускать скрипт из IDE то вы получите PID пайтона котороый висит в памяти постоянно, и повторно запустить скрипт не выйдет так как процесс с таким PID существует и работает.
Никогда такого не замечал.
Офлайн
#!/usr/bin/env python import psutil p = psutil.Process() print p.pid,p.name(),p.username(),p.create_time() print psutil.pid_exists(p.pid)
bash-3.2$ ./procinfo.py 29647 Python admin 1497430765.86 True bash-3.2$ ./procinfo.py 29649 Python admin 1497430771.93 True bash-3.2$ ./procinfo.py 29650 Python admin 1497430779.12 True
Офлайн
294
JOHN_16Другой процесс не сможет, а вот другой скрипт запущеный в пайтоне сможет. Чето я забыл про эту особенность. Надо его тода блочить на уровне ОС.
я правильно понял что утверждается, что если открыть файл на запись, например f = open('my.lock', ‘w’), то другой процесс не сможет также открыть файл?
Rodegastне буду спорить, МБ я перепутал, тем более сейчас проверил, разные пиды выдаються даже через IDE.
Никогда такого не замечал.
[code python][/code]
Отредактировано PEHDOM (Июнь 14, 2017 12:34:21)
Офлайн
221
да в том то и дело что не надо. В PID файле надо писать PID текущего процесса и его при запуске проверять. Даже удалять ничего не надо. Корректность завершения это другой вопрос и лучше его решать другими средствами.
Офлайн
72
RodegastНу так подтирайте файл на перезапуске системы
вероятность отличная от нуля, что в перезапущеной системе другой процесс получит PID который записан в вашем файле.
Офлайн
1
PEHDOM
Что то ничего у меня не получается!!
При каждом запуске программы, даже при повторном прога получает новый PID…
————————————————————————-
Вот маленький примерчик:
import os, sys PID =str(os.getpid()) if os.path.exists(os.path.dirname(sys.argv[0])+r"\Run.pid")==True: run = open(os.path.dirname(sys.argv[0])+r"\Run.pid", "r") R_run = run.read() run.close() if R_run == PID: pass sys.exit(0) else: run = open(os.path.dirname(sys.argv[0])+r"\Run.pid", "w") run.write(PID) run.close() print("Номер процесса: "+PID) input("Нажмите кнопку")
Отредактировано OzMod (Июнь 15, 2017 20:16:03)
Офлайн
294
OzModтак тебе не нужон сравнивать с текущим PID, а искать среди запущеных процессов процесс с таким PID
Что то ничего у меня не получается!!
import os, sys, psutil PID =str(os.getpid()) if os.path.exists(os.path.dirname(sys.argv[0])+r"\Run.pid")==True: run = open(os.path.dirname(sys.argv[0])+r"\Run.pid", "r") R_run = int(run.read()) run.close() if psutil.pid_exists(R_run): sys.exit(0) else: run = open(os.path.dirname(sys.argv[0])+r"\Run.pid", "w") run.write(PID) run.close() else: run = open(os.path.dirname(sys.argv[0])+r"\Run.pid", "w") run.write(PID) run.close() print("Номер процесса: "+PID) input("Нажмите кнопку")
if psutil.pid_exists(R_run): sys.exit(0)
if psutil.pid_exists(R_run): proc = psutil.Process(R_run): if proc.name = 'python.exe' # Исправить python.exe если не венда sys.exit(0)
[code python][/code]
Отредактировано PEHDOM (Июнь 15, 2017 21:50:49)
Офлайн
1
PEHDOM
ОГРОМНОЕ ТЕБЕ СПАСИБО!!!!
100 БАЛОВ ЗА ОБЪЯСНЕНИЕ!!!!!
Офлайн