Ich möchte feststellen, welcher Prozess Eigentümer einer Sperrdatei ist. Die Sperrdateien sind einfach eine Datei mit einem bestimmten Namen, der erstellt wurde.
Wie kann ich feststellen, bei welchem Prozess eine bestimmte Datei unter Linux geöffnet ist? Vorzugsweise wäre ein Einzeilentyp oder eine bestimmte Linux-Tool-Lösung optimal.
if [
Fixiereinheit "$ file" `]; dann exit`ls
folgende: Es gibt den Exit-Code 2 zurück, wenn ein Fehler vorliegt (z. B. ungültige Option angegeben) oder die Datei nicht gefunden wurde (und 0, wenn Informationen erfolgreich gemeldet wurden).Auf den meisten Linux-Systemen
lsof NAME
erledigt die Arbeit:quelle
cwd
Zeilen (die als aktuelles Arbeitsverzeichnis eines Prozesses verwendet werden) melden nur Verzeichnisse.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
Dadurch wird auch die PID des Besitzers in die Datei geschrieben, wodurch das andere Problem behoben wird:umask
eine Einstellung pro Prozess verwenden, mit der die Berechtigungen festgelegt werden, mit denen neue Dateien erstellt werden: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$'
quelle
Wenn Sie wissen möchten, welcher Dateideskriptor des exakten Prozesses auf Ihre Datei verweist, ohne
lsof
oderfuser
- suchen Sie durch/proc
:Ersetzen Sie
$1
durch den geöffneten Dateinamen, nach dem Sie suchen. Sie können das-printf
für alles ändern, was Sie sehen möchten, oder esegrep -o '[0-9]+' | head -1
zur Verwendung mit den Informationen für diesen Prozess weiterleiten.ps -Fp <pid>
Die Antwort von @fin ist natürlich die beste Antwort. Um jedoch auf den Kommentar von @ JoseLSegura zu antworten , war die obige Lösung meine Antwort.
$ lsof <filename>
quelle
Ich fand heraus, dass die Verwendung der akzeptierten Antwort nicht die Prozesse auflistete, die mein Verzeichnis verwendeten (Ubuntu 14.04).
Am Ende habe ich lsof (list open files) verwendet und die Ausgabe überprüft, um den fehlerhaften Prozess zu finden:
quelle
lsof
ist die Option-R
. zB:lsof -R [filename]