Предотвращения повторного запуска скрипта

Достаточно распространенная задача сделать так, чтобы скрипт не запускался, если уже есть его работающая копия.

Часто для этого используют pid файл, но его нужно удалять по завершению выполнения. И если наш скрипт свалится по ошибке и pid файл не удалили, то и запускаться дальше он не будет.

Также можно вызывать команду ps и парсить ее ответ.

Но есть и более удобный вариант, который укладывается в пару строк и не боится ни падений по эксепшену, ни выключения питания. И это модуль fcntl с вызовом его flock.

пример кода:

#!/usr/bin/env python
import fcntl
import time

def main():
  time.sleep(5)

if __name__ == __main__:
    fl_lock = open(our_script.lock, w)
    try:
        fcntl.flock(fl_lock.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
    except IOError:
        print Another copy already run
    else:
        main()