Noe sånt:

PID = 3187: / home / morganc / test1.out

Hvordan bruker jeg finn-kommandoen slik at den viser PID-nummeret til test1.out-filen min samt katalogen over hvor den ligger?

På forhånd takk.

Kommentarer

  • er du sikker på at du ikke forvirrer find kommando med ps?
  • Hvis prosessen som opprettet eller har filen åpen fortsatt kjører, vil Gilles svar fungere. Hvis prosessen som opprettet filen kjører ikke lenger, så er det ingen måte å finne ut hva som skjedde tidligere.
  • Hvordan fikk filen din en PID?

Svar

Du kan prøve to løsninger:

fuser /path/to/opened/file 

eller

lsof /path/to/opened/file 

Svar

Hvis du er eier av prosessen som opprettet eller har filen åpen, du kan gjøre

ls -o /proc/*/fd 2> /dev/null 

som vil vise alle filer for PID-er for bruker-ID-en din; hvis du ikke har mange prosesser som kjører, bare se manuelt på utdataene. Eksempel: på jakt etter prosess som har vmstat.out åpen:

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 

Så PID 27737 har filen vmstat.out åpen, og hele banen er /home/oracle/log/vmstat.out

Hvis du vil filtrere ut mesteparten av utdataene, kan du prøve dette:

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

Og så se etter PID rett over filen av interesse.

Så for å ignorere de andre prosessene, ledet jeg til awk, lagret den forrige linjen og skrev ut den forrige linjen da jeg fant den nåværende linjen startet med en 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 

Svar

Avhengig på hvordan jeg tolker spørsmålet ditt (se kommentarer), vil løsningen din være enten:

find $root_dir -name $file_name -exec pidof {} \; 

eller:

find $root_dir -name $file_name -exec fuser {} \; 

Hvor du definerer variabel $root_dir som startkatalogen du vil ha under for å utføre søket ditt og $file_name som navnet på filen du leter etter.

Det første alternativet hvis du søker etter en kjørbar fil kjøres, og det andre alternativet gjelder for en datafil som kjøres av en kjørbar.

For å teste dette (for det første alternativet), åpnet jeg en fil med less -kommando, trykk C-z for å stoppe den og sette den i bakgrunnen, og kjørte find /usr/bin -name less -exec pidof {} \;. For å teste det for det andre alternativet opprettet jeg en datafil ~/test.txt, løp less ~/test.txt, deretter C-z, etterfulgt av find ~ -name test.txt -exec fuser {} \;.

Kommentarer

  • Hva om 20 personer kjører less på det tidspunktet? Jeg tror OP vil ha et utdatafilnavn å lete etter.
  • Jeg forsto spørsmålet å være et søk etter bruk av en kjørbar, ikke en datafil, så i ditt tilfelle ville han få tjue pids og en enkelt vei. Jeg ser imidlertid hvordan du tolker spørsmålet annerledes, så jeg ' Jeg vil legge til en ny løsning i svaret mitt for å dekke saken din, takk.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *