Le fait qu'un fichier soit ouvert n'est pas un verrou car, si chaque processus doit d'abord vérifier si le fichier est ouvert et ne pas poursuivre s'il l'est ou le créer/ouvrir s'il ne l'est pas, alors deux processus pourraient très bien vérifier simultanément, constater tous deux qu'il n'est pas ouvert, puis le créer ou l'ouvrir.
Pour utiliser un fichier comme verrou, l'opération de vérification et de verrouillage doit être une opération unique et ininterrompue. Vous pouvez y parvenir dans un système de fichiers Unix en créant un fichier en mode lecture seule et en le supprimant pour le déverrouiller. Si le fichier existe (et qu'il est en lecture seule), la création du fichier échouera, de sorte que vous obtenez le check-and-lock en une seule opération atomique.
Si votre processus de verrouillage est un Shell Shell qui sera exécuté comme un démon, vous pouvez obtenir cet effet en utilisant umask
Ce paramètre par processus définit les autorisations avec lesquelles les nouveaux fichiers sont créés :
oldumask=$(umask)
umask 222 # create files unwritable to owner too
if echo $$ > /var/lock/foo
then
: locking succeeded
else
: locking failed
fi
umask $oldumask
Cela écrit également le PID du processus propriétaire dans le fichier, ce qui résout votre autre problème : `cat /var/lock/foo`
En ce qui concerne la question spécifique "Quels processus ont ce fichier ouvert ?", cela peut être utile lorsque vous voulez démonter un système de fichiers mais que vous ne pouvez pas le faire parce qu'un processus y a un fichier ouvert. Si vous n'avez pas ces commandes à disposition, vous pouvez demander /proc
comme racine :
ls -l /proc/*/cwd | grep '/var/lock/foo$'
ou, en tant qu'utilisateur mortel :
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'