Форум сайта python.su
0
Требуется предотвратить повторный запуск скрипта, когда одна его копия уже выполняется. Хочется простого, кроссплатформенного решения (и желательно без лишних пакетов). Решение, конечно, должно быть устойчивым к краху скрипта и отключению питания ;-) Поиск в сети показал, что большинство программистов думает, что под Windows и Unix это нужно делать по разному (или использовать какой нибудь дополнительный пакет, который прячет эти различия внутри себя).
Немного подумав набросал следующее решение. Мне оно кажется идеальным, но возможно я что-то упустил?
import os import os.path import time # Проверяем наличие lock-файл и пытаемся удалить его if os.path.exists("lock.txt"): try: os.remove("lock.txt") except os.error: # если не получилось, то другая копия скрипта # ещё работает. print("Another copy is already running...") exit(1) # Создаем lock-файл и делаем свое дело with open("lock.txt", "w") as lock: while True: print(time.time()) time.sleep(5)
Офлайн
49
fedorch
Мне оно кажется идеальным, но возможно я что-то упустил?
import os pid = os.getpid() def check_pid(pid): """ Check for the existence of a pid. """ try: os.kill(pid, 0) except OSError: return False else: return True
Отредактировано Alen (Март 7, 2014 19:04:59)
Офлайн
253
fedorchВы пишете файл в текущей директории, значит можно запустить много процессов меняя текущую директорию.
но возможно я что-то упустил?
Отредактировано doza_and (Март 7, 2014 19:16:17)
Офлайн
0
AlenСпасибо за информацию по процессам. Не думал, что часть этих функций кроссплатформенна. Не могли бы вы уточнить, что делает kill с сигналом ноль кроме того, что или вызывает или не вызывает исключение (из документации это непонятно).
Писать ID процесса в файл. При запуске читать файл, проверять наличие процесса с заданным ID, если таковой существует то запуск повторный.
Офлайн
253
fedorchтак вы сами посмотрите - пиды четырехзначные. Конечно никто не гарантирует отсутствия повторений.
получит этот же идентификатор
Офлайн
0
doza_and
Вы пишете файл в текущей директории, значит можно запустить много процессов меняя текущую директорию.
Чтобы сделать это библиотечной функцией вам надо будет быть поизобретательней с именем файла.
Может не получиться удалить файл просто если на это не хватит прав. (машина упала и вы зашли как другой пользователь).
doza_and
Если вы уже посмотрели решения неплохо написать какие и почему они вам не подошли.
doza_and
Еще вам вопрос на обдумывание. Если программа зависла, то она считается работающей или нет?
doza_and
Желание не использовать сторонние библиотеки - это желание увеличить на единицу количество сторонних библиотек.
Отредактировано fedorch (Март 7, 2014 19:35:09)
Офлайн
49
fedorch
Не думал, что часть этих функций кроссплатформенна. Не могли бы вы уточнить, что делает kill с сигналом ноль кроме того, что или вызывает или не вызывает исключение (из документации это непонятно).
Офлайн
0
doza_andНу так получается, что даже при 50 процессах одновременно бегущих на компьютере (а в реальности, я думаю, может быть и больше) мы получаем 5% шанс на неверную работу программы и сложно уловимый глюк. Нет - это не наш путь ;-)
так вы сами посмотрите - пиды четырехзначные. Конечно никто не гарантирует отсутствия повторений.
Офлайн
49
fedorch
Ну так получается, что даже при 50 процессах одновременно бегущих на компьютере (а в реальности, я думаю, может быть и больше) мы получаем 5% шанс на неверную работу программы и сложно уловимый глюк. Нет - это не наш путь ;-)
Офлайн
0
AlenПосмотрел на три разных компьютера:
PID выдаются последовательно, и циклично начиная от 2 и до 65535, если процесс завершился его PID никому не достанется пока не пробежит весь диапазон, на это могут уйти годы.
Офлайн