Блокировка повторного запуска скрипта на Python
Обычно для того чтобы исключить повторный запуск скрипта на python используют классический способ:
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)
И он хорошо срабатывает при периодическом запуске например из крона скрипта с какойто периодичностью, для проверки «а закончилась ли работа предыдущего запуска?». Но дело в том, что иногда пишут скрипт которые работает с разным функционалом в зависимости от параметров запуска. Тогда в этом случае вполне допустим запуск скрипта, но с другим параметром. Для того чтобы обойти этот момент, я стал использовать несколько другой способ. А именно: опрашиваю список запущенных в текущий момент процессов и смотрю параметры их запуска. Если нахожу совпадение, то выхожу. Если нет — позволяю скрипту работать дальше. Вышло примерно так:
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"])
..
..