Något liknande:
PID = 3187: / home / morganc / test1.out
Hur använder jag kommandot find så att det visar PID-numret på min test1.out-fil samt katalogen över var den ligger?
Tack på förhand.
Kommentarer
Svar
Du kan prova två lösningar:
fuser /path/to/opened/file
eller
lsof /path/to/opened/file
Svar
Om du är ägare till processen som skapade eller har filen öppen, du kan göra
ls -o /proc/*/fd 2> /dev/null
som visar alla filer för PID för ditt användar-ID; om du inte har många processer som körs, titta bara på utdata manuellt. Exempel: letar efter process som har vmstat.out
öppen:
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
öppen och hela sökvägen är /home/oracle/log/vmstat.out
Om du vill filtrera bort det mesta av utdata, prova detta:
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)>
Och leta efter PID precis ovanför filen av intresse.
Så för att ignorera de andra processerna, jag piped till awk, spara den tidigare raden och skriva ut den tidigare raden när jag hittade den aktuella raden började 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
Beroende på hur jag tolkar din fråga (se kommentarer) skulle din lösning vara antingen:
find $root_dir -name $file_name -exec pidof {} \;
eller:
find $root_dir -name $file_name -exec fuser {} \;
Där du definierar variabel $root_dir
som startkatalogen under vilken du vill för att utföra din sökning och $file_name
som namnet på filen som du letar efter.
Det första alternativet om du söker efter en körbar fil körs, och det andra alternativet gäller för en datafil som körs av en körbar.
För att testa detta (för det första alternativet) öppnade jag en fil med less
-kommandot, tryckte på C-z
för att stoppa det och lägga det i bakgrunden och körde find /usr/bin -name less -exec pidof {} \;
. För att testa det för det andra alternativet skapade jag en datafil ~/test.txt
, sprang less ~/test.txt
och sedan C-z
, följt av find ~ -name test.txt -exec fuser {} \;
.
Kommentarer
- Vad händer om 20 personer kör
less
då? Jag tror att OP vill ha ett utdatafilnamn att leta efter. - Jag förstod att frågan var en sökning efter användning av en körbar, inte en datafil, så i ditt fall skulle han få tjugo pids och en enda väg. Jag ser dock hur du tolkar frågan annorlunda, så jag ' Jag lägger till en andra lösning i mitt svar för att täcka ditt fall, tack.
find
-kommando medps
?