Qualcosa di simile:
PID = 3187: / home / morganc / test1.out
Come uso il comando find in modo che elencherà il numero PID del mio file test1.out e la directory in cui si trova?
Grazie in anticipo.
Commenti
Risposta
Puoi provare 2 soluzioni:
fuser /path/to/opened/file
o
lsof /path/to/opened/file
Risposta
Se sei il proprietario del processo che ha creato o ha il file aperto, voi può fare
ls -o /proc/*/fd 2> /dev/null
che elencherà tutti i file per i PID per il tuo ID utente; se non hai molti processi in esecuzione, guarda manualmente loutput. Esempio: ricerca di un processo che ha vmstat.out
aperto:
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
Quindi il PID 27737
ha il file vmstat.out
aperto e il percorso completo è /home/oracle/log/vmstat.out
Se vuoi filtrare la maggior parte delloutput, prova questo:
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)>
E poi cerca il PID proprio sopra il file di interesse.
Quindi, per ignorare gli altri processi, sono andato in pipe ad awk, salvando la riga precedente e stampando la riga precedente quando ho scoperto che la riga corrente iniziava con 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
Risposta
A seconda su come interpreto la tua domanda (vedi commenti), la tua soluzione sarebbe:
find $root_dir -name $file_name -exec pidof {} \;
o:
find $root_dir -name $file_name -exec fuser {} \;
Dove definisci la variabile $root_dir
come la directory iniziale sotto la quale vuoi per eseguire la ricerca e $file_name
come nome del file che stai cercando.
La prima alternativa se per il caso della ricerca di un file eseguibile in esecuzione, e la seconda alternativa è per il caso di un file di dati eseguito da un eseguibile.
Per testarlo (per la prima alternativa), ho aperto un file utilizzando , premuto C-z
per interromperlo e metterlo in background, quindi eseguire find /usr/bin -name less -exec pidof {} \;
. Per testarlo per la seconda alternativa, ho creato un file di dati ~/test.txt
, eseguito less ~/test.txt
, quindi C-z
, seguito da find ~ -name test.txt -exec fuser {} \;
.
Commenti
- E se 20 persone corrono
less
in quel momento? Penso che lOP voglia un nome di file di output da cercare. - Ho capito che la domanda è una ricerca per luso di un eseguibile, non un file di dati, quindi nel tuo caso, otterrebbe venti pid e un unico percorso. Capisco, tuttavia, come interpreti la domanda in modo diverso, quindi ' aggiungerò una seconda soluzione nella mia risposta per coprire il tuo caso, grazie.
find
comando conps
?