Jotain tällaista:
PID = 3187: / home / morganc / test1.out
Kuinka käytän find-komentoa niin, että siinä luetellaan test1.out-tiedostoni PID-numero sekä hakemisto se sijaitsee?
Kiitos etukäteen.
Kommentit
Vastaus
Voit kokeilla kahta ratkaisua:
fuser /path/to/opened/file
tai
lsof /path/to/opened/file
Vastaa
Jos olet prosessin omistaja, joka on luonut tiedoston tai jolla tiedosto on auki, sinä voi tehdä
ls -o /proc/*/fd 2> /dev/null
joka listaa kaikki käyttäjätunnuksesi PID-tiedostot; jos sinulla ei ole paljon prosesseja käynnissä, katso vain tulosteet manuaalisesti. Esimerkki: etsitään prosessia, jossa vmstat.out
on auki:
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
Joten PID 27737
-tiedosto vmstat.out
on auki ja koko polku on /home/oracle/log/vmstat.out
Jos haluat suodattaa suurimman osan tulosteesta, kokeile tätä:
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)>
Ja etsi sitten PID aivan kiinnostavan tiedoston yläpuolella.
Joten muut prosessit jätetään huomioimatta, pyysin awk: iin, tallensin edellisen rivin ja tulostin edellisen rivin, kun löysin nykyisen rivin alun 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
vastaus
Riippuen sen perusteella, miten tulkitsen kysymyksesi (katso kommentit), ratkaisusi olisi joko:
find $root_dir -name $file_name -exec pidof {} \;
tai:
find $root_dir -name $file_name -exec fuser {} \;
Missä määrität muuttujan $root_dir
alkuhakemistoksi, jonka alapuolelle haluat suorittamaan haun, ja $file_name
etsimäsi tiedoston nimellä.
Ensimmäinen vaihtoehto, jos kyseessä on suoritettavan tiedoston haku. suoritetaan, ja toinen vaihtoehto on suoritustiedoston suorittaman datatiedoston tapauksessa.
Tämän testaamiseksi (ensimmäiselle vaihtoehdolle) avasin tiedoston käyttämällä less
-komento, lopetti se ja asetti sen taustalle painamalla C-z
ja juoksi find /usr/bin -name less -exec pidof {} \;
. Testataksesi sitä toiselle vaihtoehdolle, loin datatiedoston ~/test.txt
, juoksin less ~/test.txt
ja sitten C-z
, jota seuraa find ~ -name test.txt -exec fuser {} \;
.
Kommentit
- Entä jos 20 henkilöä on käynnissä
less
tuolloin? Luulen, että OP haluaa lähdetiedoston nimen etsiä. - Ymmärsin kysymyksen olevan suoritettavan tiedoston etsiminen, ei datatiedoston, joten sinun tapauksessasi hän saisi kaksikymmentä pidää ja yksi polku. Ymmärrän kuitenkin, kuinka tulkitset kysymystä eri tavalla, joten ' lisätään vastaukseeni toinen ratkaisu, joka kattaa tapauksesi, kiitos.
find
-komentops
?