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

  • oletko varma, ettet hämmentänyt find -komento ps?
  • Jos tiedosto luonut tai avannut prosessi on edelleen käynnissä, Gillesin vastaus toimii. Jos tiedoston luonut prosessi ei ole enää käynnissä, joten ei voida selvittää menneisyyden tapahtumia.
  • Kuinka tiedostosi sai PID: n?

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.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *