Um einen rennfreien Mutex zu bieten, ist flock
Ihr Freund. Wenn Sie nicht unter Linux sind - wo es provided by util-linux ist - ist eine portable version verfügbar.
Wenn Sie wirklich wollen, dass es auf das gesamte System angewendet wird, indem Sie Benutzerkonten kreuzen, benötigen Sie ein Verzeichnis für Ihre Sperren, in dem alle Benutzer Dateien erstellen können, und Sie müssen sicherstellen, dass alle Benutzer kann auf deine Lockfiles schreiben.
Angenommen, Sie haben das flock
Dienstprogramm, jedes Programm, das in diesem Protokoll teilnehmen möchte, kann sich wie folgt verhalten:
#!/bin/ksh
umask 000 # allow all users to access the file we're about to create
exec 9>"/tmp/${0##*/}.lck" # open lockfile on FD 9, based on basename of argv[0]
umask 022 # move back to more restrictive file permissions
flock -x -n 9 || exit # grab that lock, or exit the script early
# continue
Ein wichtiger Hinweis: nicht versuchen Sie Lock-Dateien zu löschen, wenn Ihr Skript beendet. Wenn Sie sich in einem Zustand befinden, in dem jemand anderes aktiv versucht, eine Sperre zu greifen, haben sie bereits einen Dateideskriptor für diese vorhandene Datei; Wenn Sie die Datei löschen, während sie einen Griff haben, haben Sie nur ein Rennen sichergestellt, bei dem das Programm denken kann, dass es die Sperre hält, während jemand anderes eine neue Datei unter demselben Namen erstellt und diese sperrt.
Es scheint mir, dass Sie ein Problem haben, und Sie haben viel zu früh eine Lösung für dieses Problem gewählt. Welches Problem versuchen Sie * eigentlich * zu lösen? –
'ps' ist für diese Rolle ungeeignet: Es bietet keine Atomizitäts- oder Gleichzeitigkeitsgarantien; Sein Ergebnis ist nicht garantiert, um einen bestimmten Zeitpunkt darzustellen. Ich finde mich in einer ziemlich überwältigenden Übereinstimmung mit Philip. –
@Goahnary Sie können dies übrigens von Interesse finden, wenn Ihr Problem durch die Instanz Ihres Skripts verursacht wird * Lesen * Ihres Counters überlappend mit einer anderen Instanz des Scripts * Schreiben * des Counters. Beachten Sie, dass "echo foo> bar" nicht atomar ist - es schneidet zuerst "bar" ab, um eine leere Datei zu sein, bevor * foo hinein geschrieben wird; Für Ihren numerischen Zähler würde dies so aussehen, als würde er auf 0 zurücksetzen, bis/sofern Sie keinen Mutex implementieren, um sicherzustellen, dass immer nur ein Job ausgeführt wird. (Wenn der Server kürzlich länger gebraucht hat, um zu antworten, würde das erklären, warum Sie erst kürzlich Bugs gesehen haben). –