Noget som dette:
PID = 3187: / home / morganc / test1.out
Hvordan bruger jeg findkommandoen, så den viser PID-nummeret på min test1.out-fil samt kataloget over hvor det er placeret?
På forhånd tak.
Kommentarer
Svar
Du kan prøve to løsninger:
fuser /path/to/opened/file
eller
lsof /path/to/opened/file
Svar
Hvis du er ejer af processen, der oprettede eller har filen åben, du kan gøre
ls -o /proc/*/fd 2> /dev/null
som viser alle filer til PIDer til dit bruger-id; hvis du ikke har mange processer, der kører, skal du bare se manuelt på output. Eksempel: på udkig efter proces, der har vmstat.out
åben:
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
åben, og den fulde sti er /home/oracle/log/vmstat.out
Hvis du vil filtrere det meste af output ud, skal 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 se derefter efter PID lige over den interessefil.
Så for at ignorere de andre processer, ledte jeg til awk, gemte den forrige linje og udskrev den forrige linje, da jeg fandt den aktuelle linje 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
Afhængig efter hvordan jeg fortolker dit spørgsmål (se kommentarer), ville din løsning 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 startmappen, under hvilken du vil have for at udføre din søgning og $file_name
som navnet på den fil, du leder efter.
Det første alternativ, hvis det drejer sig om søgning efter en eksekverbar fil køres, og det andet alternativ er tilfældet med, at en datafil køres af en eksekverbar.
For at teste dette (for det første alternativ) åbnede jeg en fil ved hjælp af less
kommando, tryk på C-z
for at stoppe den og sætte den i baggrunden og kørte find /usr/bin -name less -exec pidof {} \;
. For at teste det for det andet alternativ oprettede jeg en datafil ~/test.txt
, løb less ~/test.txt
og derefter C-z
, efterfulgt af find ~ -name test.txt -exec fuser {} \;
.
Kommentarer
- Hvad hvis 20 personer kører
less
på det tidspunkt? Jeg tror, at OP vil have et outputfilnavn at se efter. - Jeg forstod, at spørgsmålet var en søgning efter brugen af en eksekverbar, ikke en datafil, så i dit tilfælde ville han få tyve pids og en enkelt sti. Jeg kan dog se, hvordan du fortolker spørgsmålet forskelligt, så jeg ' Jeg tilføjer en anden løsning i mit svar til at dække din sag, tak.
find
kommando medps
?