web-dev-qa-db-fra.com

Comment puis-je déterminer quel processus un fichier ouvert sous Linux?

Je voudrais déterminer quel processus a la propriété d'un fichier de verrouillage. Les fichiers de verrouillage sont simplement un fichier avec un nom spécifique qui a été créé.

Alors, comment puis-je déterminer quel processus a un fichier particulier ouvert sous Linux? De préférence, un type à une couche ou une solution particulière d’outil Linux serait optimal.

119
Danny

Vous pouvez également utiliser fuser pour cela:

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc:              28135
~> ps 28135
  PID TTY      STAT   TIME COMMAND
28135 pts/36   T      0:00 less .vimrc
53
Nathan Fellman

Sur la plupart des systèmes Linux, lsof NAME fait le travail:

fin@r2d2:~$ 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
fin@r2d2:~$
140
fin

Si vous voulez savoir quel descripteur de fichier exact associe votre fichier sans lsof ni fuser - effectuez une recherche dans /proc:

$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null

Remplacez $1 par le nom de fichier ouvert que vous recherchez. Vous pouvez modifier le -printf pour tout ce que vous voulez voir, ou diriger dans egrep -o '[0-9]+' | head -1 pour l'utiliser avec ps -Fp <pid> pour les informations de ce processus.

La réponse $ lsof <filename> de @fin est évidemment la meilleure solution, mais pour répondre à le commentaire de @ JoseLSegura , s’il n’est pas disponible, la solution ci-dessus est ma réponse.

4
5upa

J'ai trouvé que l'utilisation de la réponse acceptée ne répertoriait pas les processus utilisant mon répertoire (Ubuntu 14.04).

En fin de compte, j'ai utilisé lsof (liste des fichiers ouverts) et salué sa sortie pour trouver le processus incriminé:

lsof | egrep "<regexp-for-your-file>"
2
Eosis