Oczywiście przykład Dana nie zadziała tak, jak powinien.
Rzeczywiście, jeśli skrypt ulegnie awarii, wywoła wyjątek lub nie wyczyści pliku pid, skrypt zostanie uruchomiony wiele razy.
Proponuję następujące na podstawie innej witryny:
Ma to na celu sprawdzenie, czy istnieje już plik blokady
\#/usr/bin/env python
import os
import sys
if os.access(os.path.expanduser("~/.lockfile.vestibular.lock"), os.F_OK):
#if the lockfile is already there then check the PID number
#in the lock file
pidfile = open(os.path.expanduser("~/.lockfile.vestibular.lock"), "r")
pidfile.seek(0)
old_pid = pidfile.readline()
# Now we check the PID from lock file matches to the current
# process PID
if os.path.exists("/proc/%s" % old_pid):
print "You already have an instance of the program running"
print "It is running as process %s," % old_pid
sys.exit(1)
else:
print "File is there but the program is not running"
print "Removing lock file for the: %s as it can be there because of the program last time it was run" % old_pid
os.remove(os.path.expanduser("~/.lockfile.vestibular.lock"))
Jest to część kodu, w której umieszczamy plik PID w pliku blokady
pidfile = open(os.path.expanduser("~/.lockfile.vestibular.lock"), "w")
pidfile.write("%s" % os.getpid())
pidfile.close()
Ten kod sprawdzi wartość pid w porównaniu z istniejącym działającym procesem, unikając podwójnego wykonania.
Mam nadzieję, że to pomoże.