Iets als dit:

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

Hoe gebruik ik de opdracht find zodat het het PID-nummer van mijn test1.out-bestand weergeeft, evenals de map waar het bevindt zich?

Bij voorbaat dank.

Reacties

  • weet je zeker dat je niet verwart find commando met ps?
  • Als het proces dat het bestand heeft gemaakt of heeft geopend nog steeds actief is, zal Gilles antwoord werken. het proces dat het bestand heeft gemaakt, wordt niet meer uitgevoerd en er is geen manier om erachter te komen wat er in het verleden is gebeurd.
  • Hoe heeft uw bestand een PID gekregen?

Answer

U kunt 2 oplossingen proberen:

fuser /path/to/opened/file 

of

lsof /path/to/opened/file 

Answer

Als u de eigenaar bent van het proces dat het bestand heeft gemaakt of heeft geopend, u kan doen

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

die alle bestanden voor PIDs voor uw gebruikers-ID zal tonen; Als je niet veel processen hebt, kijk dan gewoon handmatig naar de output. Voorbeeld: zoek naar een proces dat vmstat.out open heeft:

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 

Dus PID 27737 heeft bestand vmstat.out geopend en het volledige pad is /home/oracle/log/vmstat.out

Als je de meeste output wilt wegfilteren, probeer dan dit:

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

En zoek dan naar de PID recht boven het betreffende bestand.

Dus om de andere processen te negeren, ging ik naar awk, bewaarde de vorige regel en drukte de vorige regel af toen ik ontdekte dat de huidige regel begon met een 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 

Antwoord

Afhankelijk op basis van hoe ik uw vraag interpreteer (zie opmerkingen), zou uw oplossing ofwel zijn:

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

of:

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

Waar u variabele $root_dir definieert als de startdirectory waaronder u wilt om uw zoekopdracht uit te voeren, en $file_name als de naam van het bestand waarnaar u zoekt.

Het eerste alternatief voor het zoeken naar een uitvoerbaar bestand wordt uitgevoerd, en het tweede alternatief is voor het geval dat een gegevensbestand wordt uitgevoerd door een uitvoerbaar bestand.

Om dit te testen (voor het eerste alternatief), heb ik een bestand geopend met de less commando, drukte op C-z om het te stoppen en op de achtergrond te plaatsen, en draaide find /usr/bin -name less -exec pidof {} \;. Om het voor het tweede alternatief te testen, heb ik een gegevensbestand ~/test.txt gemaakt, less ~/test.txt uitgevoerd en vervolgens C-z, gevolgd door find ~ -name test.txt -exec fuser {} \;.

Reacties

  • Wat als er 20 mensen less op dat moment? Ik denk dat het OP wil dat er een uitvoerbestandsnaam wordt gezocht.
  • Ik begreep dat de vraag een zoektocht was naar het gebruik van een uitvoerbaar bestand, geen gegevensbestand, dus in jouw geval zou hij twintig pids krijgen en een enkel pad. Ik zie echter hoe u de vraag anders interpreteert, dus ik ' zal een tweede oplossing aan mijn antwoord toevoegen om uw zaak te dekken, bedankt.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *