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

  • sei sicuro di non confondere find comando con ps?
  • Se il processo che ha creato o ha il file aperto è ancora in esecuzione, la risposta di Gilles funzionerà. Se il processo che ha creato il file non è più in esecuzione, quindi non cè modo di scoprire cosa è successo in passato.
  • In che modo il tuo file ha ottenuto un PID?

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *