Quelque chose comme ceci:
PID = 3187: / home / morganc / test1.out
Comment utiliser la commande find pour quelle répertorie le numéro PID de mon fichier test1.out ainsi que le répertoire où il « est localisé?
Merci davance.
Commentaires
- êtes-vous sûr de ne pas confondre
find
commande avecps
? - Si le processus qui a créé ou a ouvert le fichier est toujours en cours, la réponse de Gilles fonctionnera. Si le processus qui a créé le fichier nest plus en cours dexécution, alors aucun moyen de savoir ce qui sest passé dans le passé.
- Comment votre fichier a-t-il obtenu un PID?
Réponse
Vous pouvez essayer 2 solutions:
fuser /path/to/opened/file
ou
lsof /path/to/opened/file
Réponse
Si vous êtes le propriétaire du processus qui a créé ou a ouvert le fichier, tu pouvez faire
ls -o /proc/*/fd 2> /dev/null
qui listera tous les fichiers pour les PID pour votre ID utilisateur; si vous navez pas beaucoup de processus en cours dexécution, regardez simplement manuellement la sortie. Exemple: recherche dun processus qui a vmstat.out
ouvert:
mark (/home/mark)> ls -l /proc/*/fd 2> /dev/null /proc/27669/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:51 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:51 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 10 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 12 -> /home/mark l-wx------. 1 mark mark 64 Feb 13 19:51 2 -> /dev/null lrwx------. 1 mark mark 64 Feb 13 19:53 4 -> /home/mark/.sh_history /proc/27737/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:53 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 2 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 3 -> /home/oracle/log/vmstat.out lr-x------. 1 mark mark 64 Feb 13 19:53 4 -> anon_inode:inotify
Le PID 27737
a donc le fichier vmstat.out
ouvert et le chemin complet est /home/oracle/log/vmstat.out
Si vous souhaitez filtrer la plupart des résultats, essayez ceci:
mark (/home/oracle/log)> ls -l /proc/*/fd 2> /dev/null | grep -E "(^/proc|vmstat.out)" /proc/27669/fd: /proc/27943/fd: lr-x------. 1 mark mark 64 Feb 13 20:00 3 -> /home/oracle/log/vmstat.out /proc/28047/fd: /proc/28048/fd: /proc/self/fd: mark (/home/oracle/log)>
Et puis recherchez le PID juste au-dessus du fichier dintérêt.
Donc, pour ignorer les autres processus, jai redirigé vers awk, en sauvegardant la ligne précédente et en imprimant la ligne précédente lorsque jai trouvé la ligne actuelle commençant par un l
:
ls -l /proc/*/fd 2> /dev/null | \ grep -E "(^/proc|vmstat.out)" | \ awk "BEGIN { prev = $0} /proc/ { prev = $0 } /^l/ { print prev $NF }" /proc/27943/fd:/home/oracle/log/vmstat.out
Réponse
En fonction sur la façon dont jinterprète votre question (voir les commentaires), votre solution serait soit:
find $root_dir -name $file_name -exec pidof {} \;
ou:
find $root_dir -name $file_name -exec fuser {} \;
Où vous définissez la variable $root_dir
comme répertoire de départ sous lequel vous voulez pour effectuer votre recherche, et $file_name
comme nom du fichier que vous recherchez.
La première alternative si pour le cas de la recherche dun fichier exécutable en cours dexécution, et la deuxième alternative est dans le cas dun fichier de données exécuté par un exécutable.
Pour tester cela (pour la première alternative), jai ouvert un fichier en utilisant le less
, appuyez sur C-z
pour larrêter et le mettre en arrière-plan, puis exécutez find /usr/bin -name less -exec pidof {} \;
. Pour le tester pour la deuxième alternative, jai créé un fichier de données ~/test.txt
, exécuté less ~/test.txt
, puis C-z
, suivi de find ~ -name test.txt -exec fuser {} \;
.
less
à lépoque? Je pense que lOP veut rechercher un nom de fichier de sortie.