Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 11, 2017 21:37:11

OzMod
Зарегистрирован: 2017-01-11
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

Как сделать так что бы у меня запускался только 1 экземпляр приложения..
То есть если приложение уже запущенно , то что бы 2й экземпляр приложения не запускался..

Офлайн

#2 Июнь 11, 2017 21:39:23

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2842
Репутация: +  186  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

Сделай pid файл.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Июнь 11, 2017 21:47:20

OzMod
Зарегистрирован: 2017-01-11
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

Rodegast
Подскажите как, то есть как он должен выглядеть и что должно быть внутри?

Офлайн

#4 Июнь 11, 2017 22:35:47

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

ничего не должно быть, он может быть совершенно пустым.
берешь файл назови его как хочешь, например .pid или .lock. А у себя а скрипте пишешь примерно такой код:

Старт скрипта
Если файл .pid существует:
пробуем:
открыть .pid на запись
иначе:
выход из скрипта
иначе:
открыть .pid на запись
.....
основной код
.....
закрыть .pid
удалить .pid
конец скрипта.
Пока код работает, файл открыт на запись, и при старте кода ты проверяешь если он открыт то значит один экземпляр скрипта уже запущен, и ты завершаешь скрипт, иначе открываешь его на запись и продолжаешь работу.
есть готовые решения например вот https://pypi.python.org/pypi/pid/



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 11, 2017 22:52:08)

Офлайн

#5 Июнь 11, 2017 23:03:48

OzMod
Зарегистрирован: 2017-01-11
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

PEHDOM
Привит ..
Я по сути я так и сделал, только есть 1 проблема при не корректном завершении программы файл не удаляется (то есть в нашем случае файл .pid) - то есть программа следующий раз запускается..
приходится в ручную удалять этот .pid файл, после запускать программу!
—————————————————————————————————–
Можно этот момент как нибудь откорректировать?..

Офлайн

#6 Июнь 12, 2017 00:15:27

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2842
Репутация: +  186  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

Записывай в файл pid текущего процесса, при старте программы проверяй существует ли он. Если не существует то программа завершилась аварийно.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Июнь 13, 2017 23:31:50

OzMod
Зарегистрирован: 2017-01-11
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

Rodegast
Не получается что то!
Можешь на примере поазать!
———————————————–
в примере PEHDOM :

 Старт скрипта
Если файл .pid существует:
    пробуем:
        открыть .pid на запись
    иначе:
       выход из скрипта
иначе:
    открыть .pid на запись
.....
основной код
.....
закрыть  .pid
удалить  .pid
конец скрипта.
——————————————————–
есть 1 проблема при не корректном завершении программы файл не удаляется (то есть в нашем случае файл .pid) - то есть программа следующий раз запускается..
приходится в ручную удалять этот .pid файл, после запускать программу!
——————————————————–
Втвоем случае, почти тоже самое…
——————————————————–
[b]Записывай в файл pid текущего процесса, при старте программы проверяй существует ли он. Если не существует то программа завершилась аварийно.

Можно пожалуйста, КОНКРЕТНЫЙ МИНИМАЛЬНЫЙ ПРИМЕР ?!

Офлайн

#8 Июнь 14, 2017 05:40:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

OzMod
не надо ничего выдумывать, все уже выдумано за нас https://pypi.python.org/pypi/filelock



Офлайн

#9 Июнь 14, 2017 09:36:54

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

OzMod
есть 1 проблема при не корректном завершении программы файл не удаляется (то есть в нашем случае файл .pid) - то есть программа следующий раз запускается..
приходится в ручную удалять этот .pid файл, после запускать программу!
Это потому что ты проверяешь файл на существование, а нужно на занятость. Тоесть не просто создать-удалить, а создать и держать открытым на протяжении всей работы скрипта. В случае некоректного завершения, файл остается но разблокируеться поскольку процес котороый держи его уже не сществует.
Единственное исключение если ты запустишь скрипт из IDE. Поскольку пайтон язык интерпретируемый, то файл держит не сам скрипт а процесс пайтона. И скрипт вылетает изза исключения а файл остаеться занятым. но тут может помочь менеджер контекста.
 with open('.lock', 'bw') as lockFile:
    #тут идет основной текст скрипта....
то что предлагает Rodegast выглядит примерно так:
Старт скрипта
Если файл .pid существует:
открываем и читаем из него PID
смотрим в процессах, если есть процесс с таким PID:
завершаем скрипт
иначе:
пишем свой PID в файл
иначе:
создаем файл, пишем свой PID в файл
закрываем .pid
основной код
.....
но тут тоже есть капля дегтя. Несмотря на то, что однажды выданный и используемый PID не может быть назначен повторно, в случае сбоя питания есть вероятность отличная от нуля, что в перезапущеной системе другой процесс получит PID который записан в вашем файле.
Ну и опять же если запускать скрипт из IDE то вы получите PID пайтона котороый висит в памяти постоянно, и повторно запустить скрипт не выйдет так как процесс с таким PID существует и работает.




==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 14, 2017 09:37:51)

Офлайн

#10 Июнь 14, 2017 10:36:49

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Ограничение запуска прилажения

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version