क्यों “ps aux | grep x "" pgrep x "से बेहतर परिणाम देते हैं?


82

मैंने सिर्फ अपने उबंटू पर निम्नलिखित कमांड की कोशिश की है, यह एक चीज़ नहीं दिखाता है:

pgrep php5

क्या इसे php5 की प्रक्रिया आईडी को वापस नहीं करना चाहिए (जो कि निम्नलिखित कमांड बस करता है) ?:

ps aux | grep php5

तो, इन दोनों आदेशों के बीच अंतर क्या है?

जवाबों:


75

ps auxपूर्ण कमांड लाइन (पथ और पैरामीटर) शामिल है, जबकि pgrep केवल निष्पादन योग्य के नामों के पहले 15 वर्णों को देखता है

ps auxप्रत्येक प्रक्रिया की पूरी कमांड लाइन लौटाता है, जबकि pgrepकेवल निष्पादकों के नामों को देखता है।

इसका मतलब है कि ग्रेपिंग ps aux आउटपुट किसी भी चीज से मेल खाएगा जो कि किसी प्रक्रिया के मापदंडों या मापदंडों में होता है 'बाइनरी: उदा'

  • ps aux | grep php5 मैच होगा /usr/share/php5/i-am-a-perl-script.pl
  • लेकिन pgrep php5नहीं होगा

मेरे सिस्टम से एक उदाहरण लें - केवल हम इसके बजाय अजगर का उपयोग करेंगे php5:

  • ps aux | grep python हमें देता है:
izx 2348 0.0 0.7 514928 15644? Sl Jun24 0:00 / usr / bin / python / usr / lib / एकता-लेंस-वीडियो / एकता-लेंस-वीडियो
izx 2444 0.0 0.9 547392 18864? Sl Jun24 0:01 / usr / bin / python / usr / lib / एकता-गुंजाइश-वीडियो-रिमोट / एकता-गुंजाइश-वीडियो-रिमोट
रूट 2805 0.0 0.5 95436 12204? एस जुन 24 0:00 / यूएसआर / बिन / अजगर / यूएसआर / लिब / सिस्टम-सर्विस / सिस्टम-सर्विस-डी
izx 6272 0.0 2.9 664400 60320? SNL Jun24 1:16 / usr / bin / python / usr / bin / update-manager -no-focus-on-map
रूट 11729 0.0 0.9 180508 19516? एस जून 25 0:00 पायथन / यूएसआर / लिब / सॉफ्टवेयर-प्रॉपर्टीज / सॉफ्टवेयर-प्रॉपर्टीज-डबस
  • लेकिन pgrep pythonकेवल वही रिटर्न 11729, जो आप उपरोक्त सूची से देखेंगे:
रूट 11729 0.0 0.9 180508 19516? एस Jun25 0:00 अजगर / usr / lib / सॉफ्टवेयर-गुण / सॉफ्टवेयर-गुण-दास

3
"pgrep -l" इस प्रक्रिया को 15 वर्णों तक पहुंचाता है, जो शायद एक बग है लेकिन उम्र के लिए इस तरह रहा है
थोर्सन

1
खैर यह 2008 के रूप में एक नदी के ऊपर बग के रूप में लॉन्चपैड में है :) "ऊपर और ps truncate आदेश के बाद 15 वर्ण" bugs.launchpad.net/ubuntu/+source/procps/+bug/295876
Thorsen

2
हह, यह इसे समझाता है, टिप्पणी # 3 से: यह इस तथ्य के कारण है कि प्रॉक्स की कुछ प्रक्रियाओं को कमांड नाम मिलता है, /proc/<pid>/statलेकिन इससे नहीं/proc/<pid>/cmdline । ठीक है, @ टॉर्सन, आप बग स्प्रे जीतते हैं, यह एक बग है: पी
ईश

2
@xczzhh pgrepएक अनुचित आदेश नहीं है। यह अच्छी तरह से और डिजाइन के अनुसार काम करता है। मुद्दा बस यह है कि आप एक विकल्प याद कर रहे थे जब आप इसे चलाते हैं, तो आप इसके pgrepलिए दोष नहीं दे सकते । उपयोग ps aux | grep xxxअविश्वसनीय है इसलिए grepआउटपुट से खुद को फ़िल्टर करने के लिए हैक्स की आवश्यकता होती है और इसके साथ गलत सकारात्मकता दे सकते हैं ps aux | grep root
jlliagre

1
यह एक एंटी-ड्रग कमर्शियल में होना चाहिए, बीएएस टूल्स के निर्माता एलएसडी पर इतने धधक रहे थे कि उन्हें लगा कि इस तरह की चीजों को अच्छी तरह से डिजाइन किया गया है
एंडी रे

78

ps aux | grep xआदेश से "बेहतर" परिणाम देता है pgrep xअनिवार्य रूप से, क्योंकि यदि आप बाद के साथ एक विकल्प याद कर रहे हैं।

केवल पूर्ण कमांड लाइन को खोजने के -fलिए विकल्प का उपयोग करें pgrepऔर न केवल प्रक्रिया का नाम जो कि उसका डिफ़ॉल्ट व्यवहार है, जैसे:

pgrep -f php5

ps | grepनिर्माण के विपरीत जिसके साथ आपको grepलाइन को फ़िल्टर करने या पैटर्न ट्रिक्स का उपयोग करने की आवश्यकता होती है , pgrepबस खुद को डिज़ाइन द्वारा नहीं चुना जाएगा।

इसके अलावा, आपका पैटर्न ps USERकॉलम में दिखना चाहिए , आपको आउटपुट में अवांछित प्रक्रियाएं मिलेंगी, pgrepइस दोष से ग्रस्त नहीं होना चाहिए।

यदि आप केवल pids के बजाय पूर्ण विवरण चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

ps wup $(pgrep -f python)

जो सरल और अधिक विश्वसनीय है

ps aux | grep python | grep -v grep

या

ps aux | grep p[y]thon

3
यदि आप पूर्ण कमांड लाइन देखना चाहते हैं तो केवल -a( --list-full) विकल्प भी न जोड़ें । (पुराने pgrep के पास नहीं था -a, इस पर किया-fl ।)
बेनी चेर्नियाव्स्की-पास्किन

1
मूल प्रश्न अंतर के बारे में पूछ रहा था, लेकिन यह वास्तव में हम में से उन लोगों को देता है जो pgrepअच्छा समाधान प्राप्त करने की कोशिश कर रहे हैं। +1
2rs2ts

@ 2rs2ts धन्यवाद, मैं वास्तव में पूछे गए प्रश्न का उत्तर देने के लिए गायब था। अब तय हो गया।
जूलियाग्रे

कुछ मामलों में जब कार्यक्रम /proc/self/cmdline"वर्णनात्मक" होने के लिए संशोधित होते हैं, pgrep -fa rubyउदाहरण के लिए मेल नहीं खाते। puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker], जबकि "डम्बर" pgrep -a rubyहोगा। निश्चित नहीं कि बाद वाले को मूर्ख भी बनाया जा सकता है।
बेनी चेर्नियाव्स्की-पास्किन

@ BeniCherniavsky-Paskin मुझे लगता है कि प्रश्न के लिए एक टिप्पणी हो सकता था, क्योंकि यह दोनों के लिए लागू pgrepऔर ps
फ्रेंकलिन यू

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

12
यह प्रश्न के उत्तर का उत्तर दे सकता है - लेकिन शायद आप यह बताने के लिए अपने उत्तर का विस्तार कर सकते हैं कि यह एक पंक्ति कमांड क्या करता है।
जीवाश्म

1

इस समय, psअधिक पूर्ण आउटपुट देगा pgep -fक्योंकि pgrep पहले 4,096 वर्णों तक सीमित है (अक्सर जावा उपयोगकर्ताओं को एक लंबे वर्गपथ वाले जावा प्रोग्राम की प्रविष्टि कक्षा की तलाश में प्रभावित करता है)। इस पर नज़र रखने वाला बग है: https://gitlab.com/procps-ng/procps/issues/86


इसके लिए हमेशा तत्पर रहे।
tresf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.