138 votes

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

J'aimerais déterminer quel processus est propriétaire 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, une solution de type one-liner ou un outil Linux particulier serait optimal.

150voto

fin Points 1846

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:~$

66voto

Nathan Fellman Points 8972

Vous pouvez également utiliser fuser pour ça :

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

9voto

Dan McGrath Points 380

Le fait qu'un fichier soit ouvert n'est pas un verrou car, si chaque processus doit d'abord vérifier si le fichier est ouvert et ne pas poursuivre s'il l'est ou le créer/ouvrir s'il ne l'est pas, alors deux processus pourraient très bien vérifier simultanément, constater tous deux qu'il n'est pas ouvert, puis le créer ou l'ouvrir.

Pour utiliser un fichier comme verrou, l'opération de vérification et de verrouillage doit être une opération unique et ininterrompue. Vous pouvez y parvenir dans un système de fichiers Unix en créant un fichier en mode lecture seule et en le supprimant pour le déverrouiller. Si le fichier existe (et qu'il est en lecture seule), la création du fichier échouera, de sorte que vous obtenez le check-and-lock en une seule opération atomique.

Si votre processus de verrouillage est un Shell Shell qui sera exécuté comme un démon, vous pouvez obtenir cet effet en utilisant umask Ce paramètre par processus définit les autorisations avec lesquelles les nouveaux fichiers sont créés :

oldumask=$(umask)
umask 222   # create files unwritable to owner too
if echo $$ > /var/lock/foo
then
    : locking succeeded
else
    : locking failed
fi
umask $oldumask
Cela écrit également le PID du processus propriétaire dans le fichier, ce qui résout votre autre problème : `cat /var/lock/foo`

En ce qui concerne la question spécifique "Quels processus ont ce fichier ouvert ?", cela peut être utile lorsque vous voulez démonter un système de fichiers mais que vous ne pouvez pas le faire parce qu'un processus y a un fichier ouvert. Si vous n'avez pas ces commandes à disposition, vous pouvez demander /proc comme racine :

ls -l /proc/*/cwd | grep '/var/lock/foo$'

ou, en tant qu'utilisateur mortel :

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'

7voto

Si vous voulez savoir quel descripteur de fichier du processus exact est lié à votre fichier sans lsof o fuser - recherche par /proc :

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

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

El $ lsof _<filename>_ la réponse de @fin est la meilleure, évidemment, mais pour répondre à Commentaire de @JoseLSegura Si ce n'est pas possible, la solution ci-dessus était ma réponse.

2voto

Eosis Points 121

J'ai trouvé que l'utilisation de la réponse acceptée ne listait pas les processus qui utilisaient mon répertoire (ubuntu 14.04).

Finalement, j'ai utilisé lsof (list open files) et j'ai parcouru sa sortie pour trouver le processus incriminé :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X