Найти - Пользователи
Полная версия: Ограничение запуска прилажения
Начало » Python для новичков » Ограничение запуска прилажения
1 2
OzMod
Как сделать так что бы у меня запускался только 1 экземпляр приложения..
То есть если приложение уже запущенно , то что бы 2й экземпляр приложения не запускался..
Rodegast
Сделай pid файл.
OzMod
Rodegast
Подскажите как, то есть как он должен выглядеть и что должно быть внутри?
PEHDOM
ничего не должно быть, он может быть совершенно пустым.
берешь файл назови его как хочешь, например .pid или .lock. А у себя а скрипте пишешь примерно такой код:
Старт скрипта
Если файл .pid существует:
пробуем:
открыть .pid на запись
иначе:
выход из скрипта
иначе:
открыть .pid на запись
.....
основной код
.....
закрыть .pid
удалить .pid
конец скрипта.
Пока код работает, файл открыт на запись, и при старте кода ты проверяешь если он открыт то значит один экземпляр скрипта уже запущен, и ты завершаешь скрипт, иначе открываешь его на запись и продолжаешь работу.
есть готовые решения например вот https://pypi.python.org/pypi/pid/
OzMod
PEHDOM
Привит ..
Я по сути я так и сделал, только есть 1 проблема при не корректном завершении программы файл не удаляется (то есть в нашем случае файл .pid) - то есть программа следующий раз запускается..
приходится в ручную удалять этот .pid файл, после запускать программу!
—————————————————————————————————–
Можно этот момент как нибудь откорректировать?..
Rodegast
Записывай в файл pid текущего процесса, при старте программы проверяй существует ли он. Если не существует то программа завершилась аварийно.
OzMod
Rodegast
Не получается что то!
Можешь на примере поазать!
———————————————–
в примере PEHDOM :
 Старт скрипта
Если файл .pid существует:
    пробуем:
        открыть .pid на запись
    иначе:
       выход из скрипта
иначе:
    открыть .pid на запись
.....
основной код
.....
закрыть  .pid
удалить  .pid
конец скрипта.
——————————————————–
есть 1 проблема при не корректном завершении программы файл не удаляется (то есть в нашем случае файл .pid) - то есть программа следующий раз запускается..
приходится в ручную удалять этот .pid файл, после запускать программу!
——————————————————–
Втвоем случае, почти тоже самое…
——————————————————–
[b]Записывай в файл pid текущего процесса, при старте программы проверяй существует ли он. Если не существует то программа завершилась аварийно.

Можно пожалуйста, КОНКРЕТНЫЙ МИНИМАЛЬНЫЙ ПРИМЕР ?!
FishHook
OzMod
не надо ничего выдумывать, все уже выдумано за нас https://pypi.python.org/pypi/filelock
PEHDOM
OzMod
есть 1 проблема при не корректном завершении программы файл не удаляется (то есть в нашем случае файл .pid) - то есть программа следующий раз запускается..
приходится в ручную удалять этот .pid файл, после запускать программу!
Это потому что ты проверяешь файл на существование, а нужно на занятость. Тоесть не просто создать-удалить, а создать и держать открытым на протяжении всей работы скрипта. В случае некоректного завершения, файл остается но разблокируеться поскольку процес котороый держи его уже не сществует.
Единственное исключение если ты запустишь скрипт из IDE. Поскольку пайтон язык интерпретируемый, то файл держит не сам скрипт а процесс пайтона. И скрипт вылетает изза исключения а файл остаеться занятым. но тут может помочь менеджер контекста.
 with open('.lock', 'bw') as lockFile:
    #тут идет основной текст скрипта....
то что предлагает Rodegast выглядит примерно так:
Старт скрипта
Если файл .pid существует:
открываем и читаем из него PID
смотрим в процессах, если есть процесс с таким PID:
завершаем скрипт
иначе:
пишем свой PID в файл
иначе:
создаем файл, пишем свой PID в файл
закрываем .pid
основной код
.....
но тут тоже есть капля дегтя. Несмотря на то, что однажды выданный и используемый PID не может быть назначен повторно, в случае сбоя питания есть вероятность отличная от нуля, что в перезапущеной системе другой процесс получит PID который записан в вашем файле.
Ну и опять же если запускать скрипт из IDE то вы получите PID пайтона котороый висит в памяти постоянно, и повторно запустить скрипт не выйдет так как процесс с таким PID существует и работает.


JOHN_16
я правильно понял что утверждается, что если открыть файл на запись, например f = open('my.lock', ‘w’), то другой процесс не сможет также открыть файл?
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