Auf den meisten Linux-Systemen lsof NAME
macht den Job:
[email protected]:~$ lsof /home/fin
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 21310 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21320 fin cwd DIR 8,1 4096 5054467 /home/fin
lsof 21321 fin cwd DIR 8,1 4096 5054467 /home/fin
[email protected]:~$
Sie können auch fuser
verwenden dazu:
~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc: 28135
~> ps 28135
PID TTY STAT TIME COMMAND
28135 pts/36 T 0:00 less .vimrc
Das Öffnen einer Datei ist keine Sperre, denn wenn jeder Prozess zuerst prüfen muss, ob die Datei geöffnet ist, und nicht fortfahren muss, wenn dies der Fall ist, oder sie erstellen/öffnen muss, wenn dies nicht der Fall ist, dann könnten zwei Prozesse durchaus gleichzeitig prüfen, beide finden dass es nicht geöffnet ist, dann erstellen oder öffnen Sie es.
Um eine Datei als Sperre zu verwenden, muss die Check-and-Lock-Operation eine einzelne, nicht unterbrechbare Operation sein. Sie können dies in einem Unix-Dateisystem erreichen, indem Sie eine Datei mit Nur-Lese-Modus erstellen und sie zum Entsperren entfernen. Wenn die Datei existiert (und nur gelesen werden kann), schlägt die Dateierstellung fehl, sodass Sie Check-and-Lock in einer einzigen atomaren Operation erhalten.
Wenn Ihr Sperrprozess ein Shell-Skript ist, das als Daemon ausgeführt wird, können Sie diesen Effekt erzielen, 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 $oldumaskDadurch wird auch die PID des besitzenden Prozesses in die Datei geschrieben, was Ihr anderes Problem löst:
cat /var/lock/foo
In Bezug auf die spezifische Frage "Welche Prozesse haben diese Datei geöffnet?" Dies kann nützlich 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
fragen als Wurzel:
ls -l /proc/*/cwd | grep '/var/lock/foo$'
oder als normaler Benutzer:
ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'