Найти - Пользователи
Полная версия: Ограничение запуска прилажения
Начало » Python для новичков » Ограничение запуска прилажения
1 2
Rodegast
> в случае сбоя питания есть вероятность отличная от нуля, что в перезапущеной системе другой процесс получит PID который записан в вашем файле.

Ну можно проверять не только на PID, но ещё и на python.

> Ну и опять же если запускать скрипт из IDE то вы получите PID пайтона котороый висит в памяти постоянно, и повторно запустить скрипт не выйдет так как процесс с таким PID существует и работает.

Никогда такого не замечал.
vic57
 #!/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
PEHDOM
JOHN_16
я правильно понял что утверждается, что если открыть файл на запись, например f = open('my.lock', ‘w’), то другой процесс не сможет также открыть файл?
Другой процесс не сможет, а вот другой скрипт запущеный в пайтоне сможет. Чето я забыл про эту особенность. Надо его тода блочить на уровне ОС.
Rodegast
Никогда такого не замечал.
не буду спорить, МБ я перепутал, тем более сейчас проверил, разные пиды выдаються даже через IDE.
JOHN_16
да в том то и дело что не надо. В PID файле надо писать PID текущего процесса и его при запуске проверять. Даже удалять ничего не надо. Корректность завершения это другой вопрос и лучше его решать другими средствами.
PooH
Rodegast
вероятность отличная от нуля, что в перезапущеной системе другой процесс получит PID который записан в вашем файле.
Ну так подтирайте файл на перезапуске системы
OzMod
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("Нажмите кнопку")
PEHDOM
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("Нажмите кнопку")
это “простой вариант”, сложный нужно еще проверять на то что это PID принадлежить пайтону.
 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)
OzMod
PEHDOM
ОГРОМНОЕ ТЕБЕ СПАСИБО!!!!
100 БАЛОВ ЗА ОБЪЯСНЕНИЕ!!!!!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB