Elle se base sur la réponse par l'utilisateur zgoda. Il traite essentiellement d'une question délicate souci d'avoir à faire avec l'accès en écriture au fichier de verrouillage. En particulier, si le fichier de verrouillage a été créé par root
, un autre utilisateur foo
pouvez ensuite pas réussi à plus la tentative de réécrire ce fichier en raison de l'absence des autorisations d'écriture pour l'utilisateur foo
. La solution la plus évidente semble être de créer un fichier avec les permissions d'écriture pour tout le monde. Cette solution s'appuie également sur une autre réponse par moi-même, d'avoir à faire la création d'un fichier avec de telles autorisations personnalisées. Cette préoccupation est importante dans le monde réel où votre programme peut être exécuté par n'importe quel utilisateur.
import fcntl, os, stat, tempfile
# Establish lock file settings
lf_name = '.appname.lock'
lf_path = os.path.join(tempfile.gettempdir(), lf_name)
lf_flags = os.O_WRONLY | os.O_CREAT
lf_mode = stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH # This is 0o222, i.e. 146
# Create lock file
umask_original = os.umask(0)
try:
lf_fd = os.open(lf_path, lf_flags, lf_mode)
finally:
os.umask(umask_original)
# Try locking the file
try:
fcntl.lockf(lf_fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
msg = ('Error: {0} may already be running. Only one instance of it '
'can run at a time.'
).format('appname')
exit(msg)
J'aurais bien aimé utiliser /var/run/<appname>/
que le répertoire pour le fichier de verrouillage, mais la création de ce répertoire exige root
des autorisations. Vous pouvez faire votre propre décision pour un répertoire à utiliser.
Notez qu'il n'est pas nécessaire d'ouvrir un handle de fichier pour le fichier de verrouillage.