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

  • er du sikker på, at du ikke forveksler find kommando med ps?
  • Hvis processen, der oprettede eller har filen åben, stadig kører, fungerer Gilles svar. Hvis processen, der oprettede filen, kører ikke længere, så er der ingen måde at finde ud af, hvad der skete tidligere.
  • Hvordan fik din fil et PID?

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *