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

  • är du säker på att du inte förvirrar find -kommando med ps?
  • Om processen som skapade eller har filen öppen fortfarande körs Gilles svar. Om processen som skapade filen körs inte längre, då är det inget sätt att ta reda på vad som hände tidigare.
  • Hur fick din fil ett PID?

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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *