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
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.
find
cups
?