Question Comment puis-je déterminer quel processus un fichier est 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 ouvre un fichier particulier sous Linux? De préférence, un type de ligne unique ou une solution d'outil Linux particulière serait optimale.


112
2018-01-19 16:08


origine




Réponses:


Vous pouvez aussi 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

49
2018-01-19 17:37



C'était génial, mais pour l'utiliser dans un script, je devais vérifier la longueur de sortie. - chovy
que voulez-vous dire la longueur de sortie? - Nathan Fellman
if [ unité de fusion "$ file" `]; puis quittez - chovy
fuser a un comportement étrange avec les codes de sortie. il renvoie 1 code de sortie avec deux états: A / une erreur interne, fichier vérifié non trouvé etc., B / aucun processus ouvert fichier spécifié. En situation Un / un message d'erreur est imprimé à sa sortie. Malheureusement, lorsque le fichier est disponible et ouvert par quelque chose, la sortie est générée mais avec le code de sortie 0. Il serait préférable que l'unité de fusion quitte avec trois codes, pas deux comme actuellement. lsoft est un peu plus difficile à résoudre car cela fonctionne plus lentement. - Znik
C'est essentiellement le même modèle que ls suit - il renvoie le code de sortie 2 s'il y a une erreur (par exemple, une option non valide est spécifiée) ou fichier introuvable (et 0 si l’information a été correctement transmise). - Scott


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

133
2018-01-19 16:18



Et si vous n'avez pas lsof? - JoseLSegura
@JoseLSegura: Je suppose que vous avez assez de ressources pour la réponse "puis installez lsof" pour que vous ne puissiez plus rien faire. Pouvez-vous élaborer sur votre problème? Si vous n'avez pas root, vous n'avez probablement pas de privilèges pour savoir si un autre utilisateur a le fichier ouvert de toute façon. - Michael Scheper


Avoir un fichier ouvert n'est pas un verrou car si chaque processus doit vérifier si le fichier est ouvert en premier et ne pas continuer 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. qu'il n'est pas ouvert, puis à la fois créer ou ouvrir.

Pour utiliser un fichier comme verrou, l'opération de vérification et de verrouillage doit être une opération sans interruption unique. 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, vous obtiendrez donc une vérification et un verrouillage en une seule opération atomique.

Si votre processus de verrouillage est un script shell qui s'exécutera en tant que 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 # crée aussi des fichiers non écrits par le propriétaire
si echo $$> / var / lock / foo
puis
    : le verrouillage a réussi
autre
    : le verrouillage a échoué
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 que certains processus ont un fichier ouvert. Si vous ne disposez pas de ces commandes, 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$'


8
2018-01-20 13:14



la méthode `ls -l 'fonctionne pour Linux mais ne semble pas fonctionner pour CygWin: il n'y a pas d'informations sur le verrouillage de fichier. Ne saurais-tu pas résoudre? Merci. - Sopalajo de Arrierez
Non, vous ne créez pas de fichier en lecture seule pour un verrou, car lorsque votre application va planter, le fichier sera toujours là. Forcer l'utilisateur à effacer la merde après que votre application en panne soit mentale. - polkovnikov.ph


Si vous souhaitez connaître le descripteur de fichier exact du processus lié à votre fichier sans lsof ou fuser - recherche à travers /proc:

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

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

le $ lsof <filename> réponse par @fin est la meilleure réponse, évidemment, mais pour répondre Commentaire de JoseLSeguraSi cela n'est pas disponible, la solution ci-dessus a été ma réponse.


3
2017-11-15 21:41





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).

En fin de compte, j'ai utilisé lsof (list open files) et étalé sa sortie pour trouver le processus incriminé:

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

1
2017-10-30 14:21