GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ich feststellen, welcher Prozess eine Datei in Linux geöffnet hat?

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 $oldumask
Dadurch 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$'


Linux
  1. Was ist NFS und wie wird es unter Linux installiert?

  2. Wie erstelle, extrahiere oder öffne ich eine RAR-Datei unter Linux?

  3. Wie kann man feststellen, welcher Prozess eine Datei erstellt?

  4. Wie kann ich eine mehrteilige Tar-Datei unter Linux erstellen?

  5. Wie bestimmen Sie, welche Art von CPU-Sockel ein Linux-Computer hat?

So öffnen Sie eine Datei unter Linux

So bestimmen Sie den MIME-Typ einer Datei in Linux

So ändern Sie das Limit für offene Dateien in Linux

Was sind symbolische Links in Linux? Wie erstellt man symbolische Links?

So verwenden Sie den Befehl lsof unter Linux

Wie kann ich feststellen, welcher Prozess einen bestimmten Port unter Linux geöffnet hat?