Avoir un fichier ouvert n’est pas un verrou, car si chaque processus doit vérifier si le fichier est ouvert en premier et ne pas continuer s’il est ouvert ou le créer / l’ouvrir s’il ne l’est pas, alors deux processus pourraient très bien vérifier simultanément, les deux qu'il ne soit pas ouvert, alors les deux le créent ou l'ouvrent.
Pour utiliser un fichier en tant que verrou, l’opération d’archivage 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 est en lecture seule), la création du fichier échouera. Vous obtiendrez ainsi check-and-lock en une seule opération atomique.
Si votre processus de verrouillage est un script shell qui s'exécutera en tant que démon, vous pouvez obtenir cet effet en utilisant umask
un paramètre par processus qui définit les autorisations avec lesquelles les nouveaux fichiers sont créés:
oldumask = $ (umask)
umask 222 # crée également des fichiers impossibles à écrire par le propriétaire
si echo $$> / var / lock / foo
ensuite
: verrouillage réussi
autre
: le verrouillage a échoué
Fi
umask $ oldumask
Ceci é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 souhaitez démonter un système de fichiers mais que vous ne pouvez pas le faire car certains processus ont un fichier ouvert. Si vous n'avez pas ces commandes disponibles, vous pouvez demander en
/proc
tant que root:
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$'