Блокировка повторного запуска скрипта на Python
Обычно для того чтобы исключить повторный запуск скрипта на python используют классический способ:
1 2 3 4 5 6 |
import os,fcntl fp = open(os.path.realpath(__file__), 'r') try: fcntl.flock(fp, fcntl.LOCK_EX | fcntl.LOCK_NB) except IOError: sys.exit(0) |
И он хорошо срабатывает при периодическом запуске например из крона скрипта с какойто периодичностью, для проверки «а закончилась ли работа предыдущего запуска?». Но дело в том, что иногда пишут скрипт которые работает с разным функционалом в зависимости от параметров запуска. Тогда в этом случае вполне допустим запуск скрипта, но с другим параметром. Для того чтобы обойти этот момент, я стал использовать несколько другой способ. А именно: опрашиваю список запущенных в текущий момент процессов и смотрю параметры их запуска. Если нахожу совпадение, то выхожу. Если нет — позволяю скрипту работать дальше. Вышло примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import psutil def AYouRun(script_param): pids=psutil.pids() cnt=0 for pid in pids: p = psutil.Process(pid) res=p.cmdline() if script_param in res: cnt=cnt+1 if cnt>1: print(f"--скрипт с параметром {script_param} уже запущен") exit(-1) return True .. .. if __name__ == '__main__': for param in sys.argv: if param == "--telegram-news": if AYouRun(param): Insert2Log("Запущен мониторинг телеграм новостей",1) client = TelegramClient("parser_data", global_config["telegram_api_id"], global_config["telegram_api_hash"]) .. .. |