Vraag Waarom doet "ps aux | grep x "geeft betere resultaten dan" pgrep x "?


Ik heb zojuist het volgende commando op mijn Ubuntu geprobeerd, het laat niets zien:

pgrep php5

zou het niet de proces-id van php5 moeten retourneren (wat het volgende commando precies doet) ?:

ps aux | grep php5

Wat is het verschil tussen deze twee commando's?


72
2018-06-28 09:43


oorsprong




antwoorden:


ps aux bevat de volledige opdrachtregel (pad en parameters), terwijl pgrep alleen naar de eerste 15 karakters van de namen van de uitvoerbare bestanden

ps aux geeft de volledige opdrachtregel van elk proces als resultaat pgrep kijkt alleen naar de namen van de uitvoerbare bestanden.

Dat betekent dat commando grep  ps aux uitvoer komt overeen met alles dat in het pad voorkomt of met de parameters van het binaire proces van een proces: b.v. `

  • ps aux | grep php5 zal matchen /usr/share/php5/i-am-a-perl-script.pl
  • maar pgrep php5 zal niet

Neem een ​​voorbeeld van mijn systeem - alleen gebruiken we python in plaats van php5:

  • ps aux | grep python geeft ons:
izx 2348 0,0,7 514928 15644? Sl Jun24 0:00 / usr / bin /Python / Usr / lib / eenheid-lens-video / eenheid-lens-video
izx 2444 0,0,9 547392 18864? Sl Jun24 0:01 / usr / bin /Python / Usr / lib / eenheid-scope-video-remote / eenheid-scope-video-afstandsbediening
wortel 2805 0,0 0,5 95436 12204? S Jun24 0:00 / usr / bin /Python / Usr / lib / systeem-bediening / system service-d
izx 6272 0.0 2.9 664400 60320? SNl Jun24 1:16 / usr / bin /Python / usr / bin / update-manager --no-focus-op-kaart
root 11729 0.0 0.9 180508 19516? S Jun25 0:00 Python / Usr / lib / software-eigenschappen / software-properties-dbus
  • Maar pgrep python alleen retouren 11729, wat je ziet in de bovenstaande lijst is:
root 11729 0.0 0.9 180508 19516? S Jun25 0:00 Python / Usr / lib / software-eigenschappen / software-properties-dbus

62
2018-06-28 10:00



"pgrep -l" beknot ook het proces tot 15 karakters, wat waarschijnlijk een bug is, maar dit is al eeuwen zo - Thorsen
Welnu, het is vanaf 2008 in een launchpad als upstream-fout :) "top en ps truncate-opdracht na 15 tekens" bugs.launchpad.net/ubuntu/+source/procps/+bug/295876 - Thorsen
Hah, dit verklaart het, uit commentaar # 3: Dit komt door het feit dat sommige procedures van procs de opdrachtnaam krijgen /proc/<pid>/stat maar niet van /proc/<pid>/cmdline. OK, @Thorsen, je wint de insectenspray, het is een foutje: P - ish
Heel erg bedankt. Volgens uw antwoord is pgrep een nogal onredelijke opdracht, omdat het in sommige omstandigheden (bijv. Mijn php5) al het lopende proces zou kunnen negeren. Is er een andere overtuigende reden dat dit commando zou moeten bestaan? - xczzhh
@xczzhh pgrep is geen onredelijke opdracht. Het werkt goed en zoals ontworpen. Het probleem is simpelweg dat je een optie mist als je het uitvoert, je kunt de schuld niet geven pgrep daarom. Gebruik makend van ps aux | grep xxx is onbetrouwbaar dus moeten hacks eruit filteren grep zelf uit de uitvoer en zou valse positieven kunnen geven zoals met ps aux | grep root. - jlliagre


De ps aux | grep x opdracht geeft "betere" resultaten dan pgrep x voornamelijk omdat je een optie mist met de laatste.

Gebruik gewoon de -f optie voor pgrep om de volledige opdrachtregel te doorzoeken en niet alleen de procesnaam die het standaardgedrag is, bijvoorbeeld:

pgrep -f php5

In tegenstelling tot de ps | grep constructie waarmee je het filter eruit moet filteren grep lijn of gebruik patroontrucs, pgrep zal zichzelf gewoon niet vanzelf uitkiezen.

Bovendien zou je patroon er in moeten verschijnen ps  USER kolom, krijg je ongewenste processen in de uitvoer, pgrep heeft geen last van deze fout.

Als u volledige details wilt in plaats van alleen de pids, kunt u het volgende gebruiken:

ps wup $(pgrep -f python)

wat eenvoudiger en betrouwbaarder is dan

ps aux | grep python | grep -v grep

of

ps aux | grep p[y]thon

70
2017-09-09 08:37



Voeg ook de -a (--list-full) optie als u de volledige opdrachtregel wilt weergeven en niet alleen de pid. (Oudere pgrep had nee -a, deed dit verder -fl.) - Beni Cherniavsky-Paskin
De oorspronkelijke vraag was om te vragen over het verschil, maar dit geeft ons eigenlijk de moeite om het te krijgen pgrep om de oplossing aardig te spelen. 1 - 2rs2ts
@ 2rs2ts Bedankt, ik miste inderdaad om de gestelde vraag te beantwoorden. Nu opgelost. - jlliagre
In sommige gevallen wanneer programma's wijzigen /proc/self/cmdline "beschrijvend" zijn, pgrep -fa ruby komt bijvoorbeeld niet overeen. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker], terwijl de "dommer" pgrep -a ruby zullen. Ik weet niet zeker of deze ook voor de gek gehouden kan worden. - Beni Cherniavsky-Paskin
@ BeniCherniavsky-Paskin Ik denk dat dat een commentaar op de vraag had kunnen zijn, omdat het op beide van toepassing is pgrep en ps. - Franklin Yu


diff <(ps aux|grep x) <(pgrep x) # :)

1
2018-06-28 10:09



Dit kan het antwoord op de vraag beantwoorden - maar misschien kunt u uw antwoord uitbreiden om uit te leggen wat deze opdracht met één regel doet. - fossfreedom♦