कैसे "पीएस" अपनी प्रक्रिया को रिपोर्ट करने से रोकें?


52
$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

क्या अंतिम प्रक्रिया (यानी, मेरे ps कमांड के रूप में एक ही समय में शुरू किया गया था) को रोकने का एक तरीका है?

(मैं एक रेगेक्स के साथ आने की कोशिश करने लगा जो शाब्दिक से मेल खाएगा लेकिन खुद से मेल नहीं खाएगा, लेकिन ऐसा लगता है, उम, सही दृष्टिकोण नहीं ...)

जवाबों:


14

मेरा उत्तर एक psलिस्टिंग में "फ़ॉबर" की खोज के लिए विशिष्ट उत्तर पर एक भिन्नता है । के तर्क से "-A" "ps"अधिक पोर्टेबल है "aux", मुझे विश्वास है, लेकिन यह परिवर्तन उत्तर के लिए अप्रासंगिक है। विशिष्ट उत्तर इस तरह दिखता है:

$ ps -A -ww | grep [f]oobar

इसके बजाय मैं इस पैटर्न का उपयोग करता हूं:

$ ps -A -ww | grep [^]]foobar

मुख्य लाभ यह है कि इस पैटर्न के आधार पर स्क्रिप्ट लिखना आसान है क्योंकि आप बस [^]]जिस भी पैटर्न की तलाश कर रहे हैं उसके साथ एक स्थिर स्ट्रिंग को संक्षिप्त करें। आपको स्ट्रिंग के पहले अक्षर को उतारने की ज़रूरत नहीं है और फिर इसे स्क्वायर ब्रेसिज़ के बीच डालें और फिर से उस बैक को फिर से जोड़ दें। जब शेल में स्क्रिप्टिंग होती है, तो [^]]जिस पैटर्न को आप देख रहे थे, उसके सामने बस चिपकना आसान होता है। बैश में स्ट्रिंग टुकड़ा करना एक बदसूरत चीज है, इसलिए मेरी भिन्नता से बचा जाता है। यह भिन्नता उन पंक्तियों को दर्शाती है जहाँ पैटर्न एक प्रमुख दाएँ-वर्ग-कोष्ठक के बिना मेल खाता है]। चूँकि एक वर्ग ब्रैकेट को बाहर करने के लिए खोज पैटर्न वास्तव में वर्ग ब्रैकेट को पैटर्न में जोड़ता है तो यह कभी भी मेल नहीं खाएगा।

इसलिए आप एक पोर्टेबल psgrepकमांड लिख सकते हैं। यहां, मैं लिनक्स, ओएस एक्स बीएसडी और अन्य के बीच अंतर के लिए कुछ भत्ता बनाता हूं। यह कॉलम हेडर को psऔर अधिक कस्टम प्रदान करता हैpsप्रारूप जो मेरी ज़रूरतों को पूरा करता है, और अतिरिक्त, अतिरिक्त विस्तृत को सूचीबद्ध करने वाली प्रक्रियाओं को प्रदर्शित करता है ताकि कोई भी कमांड-लाइन तर्क छूट न जाए। खैर, अधिकांश याद नहीं हैं। जावा जावा होने के नाते, यह अक्सर चीजों को सबसे खराब तरीके से करता है, इसलिए आप कुछ जावा सेवाओं को तर्क की अधिकतम अनुमत लंबाई से पहले चलाएंगे जो प्रक्रिया तालिका का ट्रैक रखेगा। मेरा मानना ​​है कि यह 1024 अक्षर है। कमांड-लोन की लंबाई एक प्रक्रिया शुरू करने की अनुमति दी गई है, लेकिन कर्नेल प्रक्रिया तालिका लंबाई में 1K से अधिक का कुछ भी ट्रैक रखने के लिए परेशान नहीं करती है। एक बार कमांड शुरू होने के बाद कमांड-नाम और तर्क सूची की आवश्यकता नहीं होती है, इसलिए प्रक्रिया तालिका में जो संग्रहीत होता है वह सिर्फ सूचनात्मक है।

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

नुकसान यह है कि यह वास्तव में मूल पैटर्न की तुलना में एक चार (अधिक) सामने होगा। छूट के लिए, यह पीआईडी ​​से मेल नहीं खाएगा। और जब इस्तेमाल के साथ थोड़ा भ्रामक हो सकता है grep --colour
टोनिन

67

+1 @ जम्ज़्ड ट्रिक उत्तर के लिए, हालाँकि ओपी को कुछ स्पष्टीकरण की आवश्यकता हो सकती है:

ps | grep "[d]jango"

उस रेगेक्स का उपयोग करके आप एक ऐसी प्रक्रिया शुरू कर रहे हैं, जिसका पीएस स्ट्रिंग स्वयं से मेल नहीं खाएगा, क्योंकि रेगेक्सपी मैच करता है "django"और नहीं "[d]jango"। इस तरह आप उस प्रक्रिया को बाहर कर देंगे जिसमें स्ट्रिंग है [[d] jango "जो इस मामले में grep है; वही pgrep, egrep, awk, sed, आदि पर लागू किया जा सकता है ... जो भी कमांड आप regex को परिभाषित करने के लिए उपयोग करते हैं।

आदमी से 7 रेगेक्स

   A bracket expression is a list of characters enclosed in "[]".  It nor‐
   mally matches any single character from the list (but see  below).   If
   the  list  begins  with  '^',  it matches any single character (but see
   below) not from the rest of the list.  If two characters  in  the  list
   are  separated  by '-', this is shorthand for the full range of charac‐
   ters between those two (inclusive) in the collating sequence, for exam‐
   ple,  "[0-9]" in ASCII matches any decimal digit.  It is illegal(!) for
   two ranges to share an endpoint, for example, "a-c-e".  Ranges are very
   collating-sequence-dependent,  and portable programs should avoid rely‐
   ing on them.

2
ठंडा। मैं वास्तव में रेगेक्स के साथ बहुत सहज हूं, लेकिन तुरंत ही रेक्सएक्सपी के मिलान को रोकने का कोई तरीका नहीं सोच सकता। वर्ग कोष्ठक में एक पत्र संलग्न करने से सही अर्थ निकलता है। ([^!] कुछ इस तरह भी काम करेगा ...)
स्टीव बेनेट

1
यह अच्छा और चालाक है।
राख

'Ps' विशिष्ट मामले के लिए, मैं उस प्रक्रिया के नाम के सामने '[]' का उपयोग करता हूं जिसे मैं खोज रहा हूं। फिर मुझे विशेष रूप से रेगेक्स के लिए प्रक्रिया नाम को पार्स करने की आवश्यकता नहीं है, लेकिन यह अभी भी मेल खाता है।
Neromancer

@hmontoliu यह उदाहरण के लिए काम नहीं करता है ps aux | grep [s]cript1:। क्या आप समाधान के बारे में टिप्पणी करने में मदद कर सकते हैं?
SOUser

@montoliu मेरी गलती है। ऐसा लगता है कि पिछली खोजों के कारण लाइन दिखाई गई है ...
SOUser

30

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]


अंतरिक्ष जोड़ें अगर आपको एक चरपाने ​​की आवश्यकता है:ps aux| grep "[Z] "
AD

@jamzed यह उदाहरण के लिए काम नहीं करता है: ps aux | grep [s]cript1या ps aux | grep [s]cript2। अभी भी grep लाइन दिखाई जाती है। क्या आप समाधान के बारे में टिप्पणी करने में मदद कर सकते हैं?
SOUser

@ जाजमेद मेरी गलती। ऐसा लगता है कि पिछली खोजों के कारण लाइन दिखाई गई है ...
SOUser

18

इसके बजाय pgrep का उपयोग करें: pgrep -lf django


हमेशा की तरह मैं प्लेटफ़ॉर्म का उल्लेख करना भूल गया (ओएस एक्स इस मामले में)। संभवतः pgrep विभिन्न linuxes पर काम करता है।
स्टीव बेनेट

मैं सहमत नहीं हूं, @ramruma मैं इस धागे के लिए सटीक रूप से आया क्योंकि pgrepमुझे वास्तव में यह समस्या है। लेकिन मुझे कहना होगा कि मैं इसे साइगविन (जहां psप्रक्रिया की पूरी कमांड लाइन नहीं दिखा सकता) में परीक्षण कर रहा हूं ।
शोपाजो डे एरियेरेज़

मैनुअल में कहा गया है "चल रहे pgrep या pkill प्रक्रिया कभी भी मैच के रूप में रिपोर्ट नहीं करेगी।", और वास्तव में मैंने ऐसा नहीं देखा है।
डेल्टैब

मैं सिर्फ एक समस्या से निपट रहा हूं, जहां मुझे लगा कि मैं pgrepखुद से मेल खा रहा हूं । पता चला कि यह उस bashस्क्रिप्ट फ़ाइल के नाम से मेल खा रहा था जिसे मैं इसे चला रहा था। जोड़ना -xयह तय है, तो यह आदेश नाम का सटीक मिलान करता है।
andynormancx

11

ओह रुको, यह काम करता है:

ps | grep django | grep -v grep

7
केवल अगर प्रक्रिया कमांड लाइन वैध रूप से शामिल नहीं है grep, जिसे आप सामान्य मामले में नहीं गिन सकते हैं।
बजे एक CVn

8

ps -d | grep django

मैन पीएस से:

 -d                  Lists information  about  all  processes
                     except session leaders.

अभी भी मेरा पर grep दिखाता है ...
केविन

हां, जो मेरे लिए ओएस एक्स पर काम करता है।
स्टीव बेनेट

लिनक्स पर इतनी अच्छी तरह से काम नहीं करता है।
एक्यूमेनस

आम तौर पर, विकल्प psगैर-पोर्टेबल हैं, इसलिए यह जानकारी के बिना कि यह किस प्लेटफॉर्म के लिए है, यह उत्तर बहुत उपयोगी नहीं है। इसके अलावा, यह स्पष्ट रूप से पर्याप्त नहीं है जब आप सुनिश्चित नहीं होते हैं कि आप जिस प्रक्रिया की तलाश कर रहे हैं वह एक प्रक्रिया नेता नहीं है (यानी यह मदद कर सकता है यदि आपका लक्ष्य एक डेमन है, लेकिन आम तौर पर अन्यथा नहीं)।
11

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