Ik wil bestanden zoeken met de opdracht grep
in de map /var/run
/var/run
slaat de processen op die in het systeem worden uitgevoerd en het heeft bestanden met pid
extensie. Ik wil een lijst krijgen van alle bestanden met de extensie pid
.
Commando dat ik gebruik sudo grep -nr "*.pid" .
(ik voer dit commando uit vanuit de directory /var/run
)
Het toont geen output. Ik gebruik Ubuntu 14.04 LTS.
Opmerkingen
Antwoord
TL; DR : grep
is verkeerde tool, gebruik find
met de juiste opties
Als je stat /var/run
doet, “kom je er snel achter dat /var/run
een symlink is naar /run
directory.
$ stat /var/run File: /var/run -> /run Size: 4 Blocks: 0 IO Block: 4096 symbolic link Device: 801h/2049d Inode: 696874 Links: 1 Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-02-07 13:17:01.225178554 +0800 Modify: 2017-12-18 20:44:12.898113636 +0800 Change: 2017-12-18 20:44:12.898113636 +0800
Dus je hebt echt een /run
directory nodig. voor het zoeken naar bestanden met een specifieke bestandsnaam, heb je find
commando nodig:
$ find /run -name "*.pid" /run/charon.pid /run/starter.charon.pid /run/dhclient-wlp2s0.pid
Omdat sommige bestanden in die map behoren tot root of andere systeemgebruikers, moet u die opdracht mogelijk gebruiken met sudo
.
Als alternatief kunt u de vlag -L
gebruiken om volgende symlinks toe te staan en find
op /var/run
:
$ find -L /var/run -name "*.pid" /var/run/charon.pid /var/run/starter.charon.pid /var/run/dhclient-wlp2s0.pid
Houd er ook rekening mee dat grep
is het verkeerde hulpmiddel voor de klus. grep
is voor het zoeken naar tekstpatronen binnen tekstbestanden, niet in hun bestandsnamen.
Je noemde ook:
/ var / run slaat de processen op die in het systeem worden uitgevoerd en het heeft bestanden met de extensie pid
Dat is eigenlijk onjuist. Procesinformatie hoort thuis in /proc
. De .pid
-bestanden worden gewoon gebruikt door sommige programmas om te voorkomen dat meerdere kopieën van hetzelfde proces worden uitgevoerd (nou ja, een van de mogelijke manieren waarop deze bestanden kunnen worden gebruikt). Zie deze stackoverflow-post voor referentie, evenals dit sterk gestemde antwoord op unix.se. Hoewel de directory van de rootgebruiker is, mag u er niet van uitgaan dat het alleen voor startup- en daemon-apps is; scripts die zijn gestart met rootrechten van de gebruiker zouden net zo gemakkelijk naar de directory kunnen schrijven.
Reacties
- Gebruik van
/var/run/
zal de noodzaak van-L
vermijden. Houd er ook rekening mee dat Ubuntu 14 LTS Upstart gebruikt, en het ding dat feitelijk voorkomt dat meerdere kopieën van hetzelfde programma worden uitgevoerd als meerdere processen, is dat Upstart weet ze niet te starten. - @JdeBP Sorry,
find /var/run
alleen werkt in mijn geval niet '.find --version
rapporteertfind (GNU findutils) 4.7.0-git
. Dus met mijn versie van GNUfind
heeft het in ieder geval een-L
vlag nodig. Ik weet niet zeker hoe BSDfind
dingen afhandelt. Leuk om te weten dat ongeveer 14.04 Ubuntu ' s Upstart-functie, hoewel dat ' niet helpt met scripts die meerdere kopieën van zichzelf willen vermijden draaien, dus in ieder geval op askubuntu hebben we voorgesteld om daarvoor.pid
bestanden te gebruiken. - Je leest snel wat ik schreef. Lees het opnieuw langzaam en let op de exacte volgorde van de tekens. (-:
- @JdeBP Oh … Laatste schuine strepen toevoegen …
/var/run
. U verkeert in het beste geval met het misverstand dat PID-bestanden een noodzaak zijn, terwijl ze in feite een gevaarlijk en zeer gebrekkig mechanisme zijn waar de wereld zich mee bezig houdt -lang laatst eindelijk de wijsheid geleerd om er vanaf te komen.