Das Öffnen einer Datei ist keine Sperre, denn wenn jeder Prozess zuerst überprüfen muss, ob die Datei geöffnet ist, und nicht fortfahren muss, wenn dies der Fall ist, oder sie erstellen / öffnen, wenn dies nicht der Fall ist, können durchaus zwei Prozesse gleichzeitig prüfen, ob beide dies gefunden haben dass es nicht geöffnet ist, dann erstellen oder öffnen beide es.
Um eine Datei als Sperre zu verwenden, muss der Prüf- und Sperrvorgang eine einzige unterbrechungsfreie Operation sein. Sie können dies in einem Unix-Dateisystem erreichen, indem Sie eine Datei im schreibgeschützten Modus erstellen und zum Entsperren entfernen. Wenn die Datei vorhanden ist (und schreibgeschützt ist), schlägt die Dateierstellung fehl, sodass Sie die Prüfung und Sperre in einer einzelnen atomaren Operation erhalten.
Wenn es sich bei Ihrem Sperrprozess um ein Shell-Skript handelt, das als Dämon ausgeführt wird, können Sie diesen Effekt erzielen, indem Sie umask
eine Einstellung pro Prozess verwenden, mit der die Berechtigungen festgelegt werden, mit denen neue Dateien erstellt werden:
oldumask = $ (umask)
umask 222 # Dateien erstellen, die auch für den Eigentümer nicht schreibbar sind
if echo $$> / var / lock / foo
dann
: Sperrung erfolgreich
sonst
: Sperren fehlgeschlagen
fi
umask $ oldumask
Dadurch wird auch die PID des Besitzers in die Datei geschrieben, wodurch das andere Problem behoben wird:
cat /var/lock/foo
In Bezug auf die spezifische Frage "Welche Prozesse haben diese Datei geöffnet?" Kann dies hilfreich sein, wenn Sie ein Dateisystem aushängen möchten, dies jedoch nicht können, da in einem Prozess eine Datei geöffnet ist. Wenn Sie diese Befehle nicht zur Verfügung haben, 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$'