2010-01-19 16:08:15 +0000 2010-01-19 16:08:15 +0000
127
127

Comment puis-je déterminer quel processus a un fichier ouvert dans 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 dans Linux ? Il est préférable d'utiliser un type de ligne unique ou une solution particulière d'un outil Linux.

Réponses (4)

146
146
146
2010-01-19 16:18:03 +0000

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:~$
56
56
56
2010-01-19 17:37:11 +0000

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
9
9
9
2010-01-20 13:14:12 +0000

L'ouverture d'un fichier n'est pas un verrou car, si chaque processus doit d'abord vérifier si le fichier est ouvert et ne pas procéder 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, tous deux constater qu'il n'est pas ouvert, puis tous deux 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 est en lecture seule), la création du fichier échouera, donc vous obtenez le contrôle et le verrouillage en une seule opération atomique.

Si votre processus de verrouillage est un script shell qui sera exécuté comme un démon, vous pouvez obtenir cet effet en utilisant umask, un paramètre par processus qui 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 ce fichier a-t-il 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 a un fichier ouvert dans celui-ci. Si vous n'avez pas ces commandes disponibles, vous pouvez demander /proc en tant que root :

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

2
2
2
2015-10-30 14:21:35 +0000

J'ai constaté qu'en utilisant la réponse acceptée, je n'avais pas listé les processus qui utilisaient mon répertoire ( ubuntu 14.04 ).

Finalement, j'ai utilisé lsof (liste des fichiers ouverts) et j'ai greffé sa sortie pour trouver le processus incriminé :

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