maks2236
Июль 25, 2016 08:09:18
Как можно проверить, что другая копия этого скрипта уже запущена?
Rodegast
Июль 25, 2016 11:03:04
>>> import psutil
>>> "python" in { x.name() for x in psutil.process_iter() }
True
maks2236
Июль 25, 2016 12:22:18
Rodegast
Такой вариант не подходит, потому что в системе могут работать и другие python скрипты.
Rodegast
Июль 25, 2016 15:58:39
> в системе могут работать и другие python скрипты.
Тогда проверяй по командной строке:
>>> "/usr/bin/python ./manage.py runserver" in { " ".join(x.cmdline()) for x in psutil.process_iter() }
True
py.user.next
Июль 26, 2016 00:50:02
maks2236
Как можно проверить, что другая копия этого скрипта уже запущена?
Надо создавать файл при запуске и удалять при завершении, и по его наличию на диске определять, запущена ли копия.
maks2236
Июль 26, 2016 08:00:37
py.user.next
ммм, очень интересный способ, спасибо за наводку)
Кажется apt в linux делает так же.
py.user.next
Июль 26, 2016 10:08:00
maks2236
Кажется apt в linux делает так же.
Многие приложения так делают (lock-файлы), а пакетные менджеры делают это, чтобы исключить одновременный доступ к пакетной базе данных.
PooH
Июль 26, 2016 16:45:57
Добавлю, что последовательность операций проверки и создания файла должна быть атомарна(выполняться как одна команда) чтобы избежать гонок при одновременном запуске двух ваших программ сразу. Смотрите на ключик ‘x’ у функции open.
maks2236
Июль 27, 2016 14:52:34
Не совсем понял, как этот ключ может мне помочь. Он не делает операцию атомарной, а просто проверяет существует файл или нет.
PooH
Июль 27, 2016 19:35:02
maks2236
Он не делает операцию атомарной, а просто проверяет существует файл или нет.
Нет, для вас это будет именно атомарно.
open for exclusive creation, failing if the file already exists
. Порядок вызовов на создание файла из разных потоков разрулит операционка.
Вызываете open - если вернул файловый объект, значит захватили блокировку, если словили исключение - обломились.