Ceva de genul acesta:

PID = 3187: / home / morganc / test1.out

Cum folosesc comanda find, astfel încât să afișeze numărul PID al fișierului meu test1.out, precum și directorul unde se află?

Vă mulțumim anticipat.

Comentarii

  • sunteți sigur că nu confundați find cu ps?
  • Dacă procesul care a creat sau are fișierul deschis este încă în desfășurare, răspunsul Gilles va funcționa. Dacă procesul care a creat fișierul nu mai rulează, apoi nu există nicio modalitate de a afla ce s-a întâmplat în trecut.
  • Cum a obținut fișierul dvs. un PID?

Răspuns

Puteți încerca 2 soluții:

fuser /path/to/opened/file 

sau

lsof /path/to/opened/file 

Răspuns

Dacă sunteți proprietarul procesului care a creat sau are fișierul deschis, tu poate face

ls -o /proc/*/fd 2> /dev/null 

care va lista toate fișierele pentru PID-uri pentru ID-ul dvs. de utilizator; dacă nu aveți o mulțime de procese în desfășurare, uitați-vă manual la ieșire. Exemplu: căutați un proces care are vmstat.out deschis:

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 

Deci, PID 27737 are fișierul vmstat.out deschis, iar calea completă este /home/oracle/log/vmstat.out

Dacă doriți să filtrați cea mai mare parte a rezultatului, încercați acest lucru:

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)> 

Și apoi căutați PID chiar deasupra fișierului de interes.

Deci, pentru a ignora celelalte procese, am făcut pipa la awk, salvând linia anterioară și imprimând linia anterioară când am găsit că linia curentă a început cu un 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 

Răspuns

În funcție în legătură cu modul în care vă interpretez întrebarea (a se vedea comentariile), soluția dvs. ar fi fie:

find $root_dir -name $file_name -exec pidof {} \; 

sau:

find $root_dir -name $file_name -exec fuser {} \; 

Unde definiți variabila $root_dir ca director de pornire sub care doriți pentru a efectua căutarea dvs. și $file_name ca nume al fișierului pe care îl căutați.

Prima alternativă dacă este în cazul căutării unui fișier executabil fiind executat, iar a doua alternativă este pentru cazul în care un fișier de date este rulat de un executabil.

Pentru a testa acest lucru (pentru prima alternativă), am deschis un fișier folosind , a apăsat C-z pentru ao opri și a pune-o în fundal și a rulat find /usr/bin -name less -exec pidof {} \;. Pentru a-l testa pentru a doua alternativă, am creat un fișier de date ~/test.txt, am rulat less ~/test.txt, apoi C-z, urmat de find ~ -name test.txt -exec fuser {} \;.

Comentarii

  • Ce se întâmplă dacă 20 de persoane rulează less la acel moment? Cred că PO dorește să se caute un nume de fișier de ieșire.
  • Am înțeles întrebarea ca fiind o căutare a utilizării unui fișier executabil, nu a unui fișier de date, așa că, în cazul dvs., ar primi douăzeci de pids și o singură cale. Văd, totuși, cum interpretați întrebarea diferit, așa că ' voi adăuga o a doua soluție în răspunsul meu pentru a acoperi cazul dvs., mulțumesc.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *