LINUX.ORG.RU

Python: запрет на исполнение программы в нескольких экземплярах


0

0

У меня запускается некий кроссплатформенный скрипт, который не должен выполняться более чем в одном экземпляре одновременно - при попытке повторного запуска он должен просто сразу выйти, и не должен ждать, пока завершится предыдущий процесс, и не должен начинать работу после его завершения. Можно создавать в начале программы LOCK-файл (O_CREAT|O_EXCL), а в конце удалять, но тогда при RESET'е LOCK-файл останется и не даст запуститься программе заново. Есть какие-нибудь надежные решения?

anonymous
Ответ на: комментарий от anonymous

по крайней мере, основные распространенные оси поддерживают. а вообще, стоит для каждого типа ОС сделать отдельную проверку

friday ★★★
()
Ответ на: комментарий от friday

>создавать pid-файл и при повторном запуске проверять, чей это pid

1) нет кроссплатформенного способа;

2) если название моей программы такое же, как и у другой, тогда если завершится предыдущий процесс, PID пройдут по кругу, запустится другая программа с таким же именем, будет облом.

anonymous
()
Ответ на: комментарий от anonymous

>2) если название моей программы такое же, как и у другой, тогда если завершится предыдущий процесс, PID пройдут по кругу, запустится другая программа с таким же именем, будет облом.

IMHO надуманная проблема, точно так же можно писать не в тот именованный канал, запросить чужой мьютекс, подключиться к чужому порту TCP и т.п. Уникальное короткое название придумать несложно.

seiken ★★★★★
()
Ответ на: комментарий от anonymous

>>может быть, есть аналог flock (fd, LOCK_EX)

>Он будет ждать, пока не освободится файл.

Ппрошу прощения - flock (fd, LOCK_EX | LOCK_NB)

sf ★★★
()
Ответ на: комментарий от sf

#!/usr/bin/env python

import fcntl, time
def trylock ():
file = "f.lock"
f = open (file, "wr")
return fcntl.flock (f.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)

try:
trylock ()
except IOError, err:
print err
raise

while 1:
time.sleep (1)
print "sleep 1s"

Попробуйте. Мне тоже интересен результат :]

sf ★★★
()
Ответ на: комментарий от sf

>>> import fcntl

Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> import fcntl ImportError: No module named fcntl >>> import os >>> print os.name nt >>>

anonymous
()
Ответ на: комментарий от sf

>>> import fcntl

Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> import fcntl ImportError: No module named fcntl >>> import os >>> print os.name nt >>>

anonymous
()
Ответ на: комментарий от sf

>>> import fcntl

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    import fcntl
ImportError: No module named fcntl
>>> import os
>>> print os.name
nt
>>>

anonymous
()
Ответ на: комментарий от anonymous

Под виндой можно сделать такой трюк (требуется pywin32):

try:
    WMI = GetObject('winmgmts:')
    
    processes = WMI.InstancesOf('Win32_Process')
    
    processes_list = \
        [process.Properties_('Name').Value for process in processes]
            
            
    if processes_list.count('urtvospoll.exe') > 1:
        message = wx.MessageDialog(None, 
            'Программа Urtvos Poll уже запущена',
            'Ошибка', wx.OK | wx.ICON_ERROR)
        message.ShowModal()
        message.Destroy()
        sys.exit(0)

except pywintypes.com_error:
    pass

redvasily
()
Ответ на: комментарий от anonymous

Почитал pydoc mutex, но ничего не понял. Можно пример кода?

anonymous
()
Ответ на: комментарий от Deleted

>юзай мьютексы - они и в винде есть и в линухе.

Можно примерчик?

seiken ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.