Wie identifiziere ich den Prozess, der eine Datei sperrt?

34

Ich möchte den genauen Prozess kennen, der die Sperrdatei verwendet. Ich möchte das Problem nicht beheben , sondern nur wissen, was mein System tut. Wie kann ich das herausfinden?

Zum Beispiel diese Nachricht:

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

Wieder möchte ich nur den Prozess identifizieren, der ihn verwendet, und nicht, wie man ihn repariert.

Braiam
quelle

Antworten:

38

Es gibt die berüchtigten lsof:

sudo lsof /var/lib/dpkg/lock
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
aptitude 4974 root    3uW  REG   8,23        0 815673 /var/lib/dpkg/lock

In diesem Fall verwendet aptitude die Datei. Sie sollten root verwenden, wenn Sie nicht sicher sind, welcher Benutzer die Datei sperrt. Es ist auch für eine Reihe von Dingen nützlich, leider wird es nicht mit Ubuntu installiert, also müssen Sie es zuerst installieren.

Für den Rest der Sterblichen gibt es den fuserBefehl. Dies ist eigenartig, da nur die PID anstelle des Namens des Prozesses zurückgegeben wird:

➜  ~  sudo fuser /var/lib/dpkg/lock
/var/lib/dpkg/lock:   4974

Hier heißt es, dass die Datei und PID, die 4974 ist, also müssen wir untersuchen, wer ist:

➜  ~  ps 4974
  PID TTY      STAT   TIME COMMAND
 4974 pts/1    Sl+    0:06 aptitude
Braiam
quelle
6
Warum ist lsofberüchtigt? Gibt es irgendwelche Probleme damit?
Ruslan
3
@ Ruslan Ja, es ermöglicht ahnungslosen Benutzern, die tatsächliche Nutzung der Systeme im Gegensatz zu dem, was die Sysadmins wollen, zu kennen ...
Braiam
@Braiam Zu viele Informationen können gefährlich sein, in den richtigen Händen? ^ -_- ^
Peter David Carter
Zweite Option in einer Zeile:ps $(sudo fuser /var/lib/dpkg/lock)
wjandrea
8

lslocks ist eine einfache Möglichkeit, dies zu tun.

lslocks |grep /var/lib/dpkg/lock

Verwenden Sie die Shell, um die Prozess-ID zu verarbeiten:

for pid in `lslocks -rn | grep /var/lib/dpkg/lock|awk '{print $2}'`;
do 
    echo $pid; 
done
Jolestar
quelle
Ja. lslocksist der beste Weg, dies zu tun. Mit lsofgab mir diesen Fehler: "lsof: WARNUNG: kann nicht stat () fuse.gvfsd-fuse Dateisystem / run / user / 1000 / gvfs Ausgabeinformationen möglicherweise unvollständig"
Nav
@Nav das ist kein Fehler, sondern eine WARNUNG.
Braiam