Comment identifier le processus de verrouillage d'un fichier?

35

Je veux savoir le processus exact qui utilise le fichier de verrouillage. Je ne veux pas le réparer , mais juste savoir ce que fait mon système. Comment puis-je savoir?

Par exemple, ce message:

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?

Encore une fois, je veux juste identifier le processus l’utilisant, pas comment le réparer.

Braiam
la source

Réponses:

38

Il y a l'infâme 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

Dans ce cas, aptitude utilise le fichier. Vous devez utiliser root si vous ne savez pas quel utilisateur verrouille le fichier. C'est utile pour un tas de choses aussi, malheureusement, Ubuntu n'est pas installé, vous devez donc d'abord l'installer.

Pour le reste des mortels, il y a la fusercommande. Ceci est particulier car il ne renvoie que le PID au lieu du nom du processus:

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

Ici, il est indiqué que le fichier et le PID, qui est 4974, nous devons donc déterminer qui est:

➜  ~  ps 4974
  PID TTY      STAT   TIME COMMAND
 4974 pts/1    Sl+    0:06 aptitude
Braiam
la source
6
Pourquoi est lsofinfâme? Y at-il des problèmes avec ça?
Ruslan
3
@Ruslan Ouais, cela permet aux utilisateurs désemparés de connaître l'utilisation réelle des systèmes contrairement à ce que veulent les administrateurs système ...
Braiam
@Braiam Trop d'informations peuvent être dangereuses, entre de bonnes mains? ^ -_- ^
Peter David Carter
Deuxième option en une ligne:ps $(sudo fuser /var/lib/dpkg/lock)
wjandrea
8

Lslocks est un moyen simple de le faire.

lslocks |grep /var/lib/dpkg/lock

Pour utiliser shell afin de gérer l'identifiant du processus:

for pid in `lslocks -rn | grep /var/lib/dpkg/lock|awk '{print $2}'`;
do 
    echo $pid; 
done
jolestar
la source
Oui. lslocksest la meilleure façon de s'y prendre. L'utilisation lsofm'a donné cette erreur: "lsof: AVERTISSEMENT: impossible de stat () fuse.gvfsd-système de fichiers fuse / exécuter / utilisateur / 1000 / gvfs Les informations de sortie peuvent être incomplètes"
Nav
@Nav ce n'est pas une erreur, mais un AVERTISSEMENT.
Braiam