Eine geöffnete Datei ist keine Sperre, denn wenn jeder Prozess zuerst prüfen muss, ob die Datei geöffnet ist, und nicht fortfahren muss, wenn sie geöffnet ist, oder sie erstellen/öffnen muss, wenn sie es nicht ist, dann können zwei Prozesse sehr wohl gleichzeitig prüfen, beide feststellen, dass sie nicht geöffnet ist, und sie dann beide erstellen oder öffnen.
Um eine Datei als Sperre zu verwenden, muss der Prüf- und Sperrvorgang ein einziger unterbrechungsfreier Vorgang sein. Sie können dies in einem Unix-Dateisystem erreichen, indem Sie eine Datei im Nur-Lese-Modus erstellen und sie zum Entsperren entfernen. Wenn die Datei existiert (und schreibgeschützt ist), schlägt die Dateierzeugung fehl, so dass Sie die Prüf- und Sperroperation in einer einzigen atomaren Operation erhalten.
Wenn Ihr Sperrprozess ein Shell-Skript ist, das als Daemon läuft, können Sie diesen Effekt erreichen, indem Sie umask
verwenden, eine Einstellung pro Prozess, die die Berechtigungen festlegt, mit denen neue Dateien erstellt werden:
oldumask=$(umask) umask 222 # create files unwritable to owner too if echo $$ \> /var/lock/foo then : locking succeeded else : locking failed fi umask $oldumask
Dies schreibt auch die PID des besitzenden Prozesses in die Datei, was Ihr anderes Problem löst: cat /var/lock/foo
Was die spezielle Frage “Welche Prozesse haben diese Datei geöffnet? ”, kann dies nützlich sein, wenn Sie ein Dateisystem unmounten wollen, dies aber nicht können, weil ein Prozess eine Datei geöffnet hat. Wenn Ihnen diese Befehle nicht zur Verfügung stehen, können Sie /proc
als root fragen:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
oder, als sterblicher Benutzer:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'