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
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.
find
kommando medps
?