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
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.
find
commando metps
?