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.
if [
fuser "$ file" `]; puis sortie »ls
suit: il renvoie le code de sortie 2 en cas d’erreur (par exemple, une option non valide spécifiée) ou un fichier introuvable (et 0 si le signalement est correct).Sur la plupart des systèmes Linux
lsof NAME
fait le travail:la source
cwd
lignes (qui utilisent rapport en tant que répertoire de travail actuel d'un processus) ne signalent que les répertoires.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 est ouvert ou le créer / l’ouvrir s’il ne l’est pas, alors deux processus pourraient très bien vérifier simultanément, les deux qu'il ne soit pas ouvert, alors les deux le créent ou l'ouvrent.
Pour utiliser un fichier en tant que verrou, l’opération d’archivage 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. Vous obtiendrez ainsi check-and-lock 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
Ceci écrit également le PID du processus propriétaire dans le fichier, ce qui résout votre autre problème:umask
un paramètre par processus qui définit les autorisations avec lesquelles les nouveaux fichiers sont créés:cat /var/lock/foo
En ce qui concerne la question spécifique "Quels processus ont ce fichier ouvert?", Cela peut être utile lorsque vous souhaitez démonter un système de fichiers mais que vous ne pouvez pas le faire car certains processus ont un fichier ouvert. Si vous n'avez pas ces commandes disponibles, vous pouvez demander en
/proc
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$'
la source
Si vous voulez savoir quel descripteur de fichier est lié à votre fichier sans
lsof
oufuser
- effectuez une recherche dans/proc
:Remplacez
$1
par le nom de fichier ouvert que vous recherchez. Vous pouvez modifier le-printf
pour tout ce que vous voulez voir, ouegrep -o '[0-9]+' | head -1
utiliser pour les informations de ce processus.ps -Fp <pid>
La réponse de @fin est évidemment la meilleure solution, mais pour répondre au commentaire de @ JoseLSegura , si ce n'est pas disponible, la solution ci-dessus était ma réponse.
$ lsof <filename>
la source
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é:
la source
lsof
est son option-R
. par exemple:lsof -R [filename]