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


$ 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

आखिरी प्रक्रिया को रोकने का कोई तरीका है (यानी, grep जो मेरे ps कमांड के साथ एक ही समय में शुरू हुआ था) की सूचना दी जा रही है?

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


49
2018-03-09 05:42


मूल




जवाब:


मेरा जवाब एक में "foobar" की खोज के लिए सामान्य उत्तर पर एक भिन्नता है ps सूची। का तर्क "-A" "ps" से अधिक पोर्टेबल है "aux", मेरा मानना ​​है, लेकिन यह परिवर्तन उत्तर के लिए अप्रासंगिक है। सामान्य उत्तर इस तरह दिखता है:

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

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

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

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

तो आप एक पोर्टेबल लिख सकते हैं psgrep निम्नानुसार आदेश। यहां, मैं लिनक्स, ओएस एक्स बीएसडी और अन्य के बीच मतभेदों के लिए कुछ भत्ता देता हूं। यह कॉलम हेडर से जोड़ता है ps, एक और कस्टम प्रदान करता है ps प्रारूप जो मेरी ज़रूरतों के betters के अनुरूप है, और अतिरिक्त, अतिरिक्त चौड़ा लिस्टिंग प्रक्रियाओं को प्रदर्शित करता है ताकि कमांड लाइन तर्कों में से कोई भी याद नहीं किया जा सके। खैर, ज्यादातर याद नहीं हैं। जावा जावा होने के कारण, यह अक्सर सबसे खराब तरीके से चीजें करता है, इसलिए आप कुछ जावा सेवाएं तर्कों की अधिकतम अनुमत लंबाई से पहले चलेगी कि प्रक्रिया तालिका का ट्रैक रखा जाएगा। मेरा मानना ​​है कि यह 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
}

12
2018-03-05 01:49



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


@Jamzed terse उत्तर के लिए +1, हालांकि ओपी को कुछ स्पष्टीकरण की आवश्यकता हो सकती है:

ps | grep "[d]jango"

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

आदमी 7 regex से

   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.

65
2018-03-09 07:54



ठंडा। मैं वास्तव में regexs के साथ बहुत सहज हूँ लेकिन regexp मिलान खुद को रोकने के लिए तुरंत एक रास्ता के बारे में सोच नहीं सकता। स्क्वायर ब्रैकेट में एक पत्र संलग्न करना सही समझ में आता है। (कुछ [^!] सहित कुछ भी काम करेगा ...) - Steve Bennett
यह अच्छा और चालाक है। - ash
'पीएस' विशिष्ट मामले के लिए, मैं उस प्रक्रिया नाम के सामने '[]' का उपयोग करता हूं जिसे मैं खोज रहा हूं। फिर मुझे रेगेक्स के लिए प्रक्रिया नाम को विशेष रूप से पार्स करने की आवश्यकता नहीं है, लेकिन यह अभी भी मेल खाता है। - Neromancer
@hmontoliu यह उदाहरण के लिए काम नहीं करता है: ps aux | grep [s]cript1। क्या आप समाधान के बारे में टिप्पणी करने में मदद कर सकते हैं? - SOUser
@hmontoliu मेरी गलती। ऐसा लगता है कि रेखा पिछले खोजों के कारण दिखाया गया है ... - SOUser


ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]


29
2018-03-09 07:10



यदि आपको एक char grep करने की आवश्यकता है तो स्पेस जोड़ें: ps aux| grep "[Z] " - A.D.
@jamzed यह उदाहरण के लिए काम नहीं करता है: ps aux | grep [s]cript1 या ps aux | grep [s]cript2। Grep लाइन अभी भी दिखाया गया है। क्या आप समाधान के बारे में टिप्पणी करने में मदद कर सकते हैं? - SOUser
@jamzed मेरी गलती। ऐसा लगता है कि रेखा पिछले खोजों के कारण दिखाया गया है ... - SOUser


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


17
2018-03-09 06:19



हमेशा के रूप में मैं मंच का उल्लेख करना भूल गया (इस मामले में ओएस एक्स)। संभवतः विभिन्न लिनक्स पर pgrep काम करता है। - Steve Bennett
मैं सहमत नहीं हूं, @ramruma। मैं इस थ्रेड पर ठीक से आया था pgrepमुझे वास्तव में यह समस्या देता है। लेकिन मुझे कहना होगा कि मैं इसका परीक्षण साइगविन (जहां ps प्रक्रिया की पूर्ण कमांड लाइन नहीं दिखा सकते हैं)। - Sopalajo de Arrierez
मैनुअल कहता है "चल रहा है pgrep या pkill प्रक्रिया कभी भी एक मैच के रूप में खुद को रिपोर्ट नहीं करेगा।", और वास्तव में मैंने ऐसा नहीं देखा है। - deltab


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

ps | grep django | grep -v grep

11
2018-03-09 05:46



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


ps -d | grep django

मनुष्य पीएस से:

 -d                  Lists information  about  all  processes
                     except session leaders.

8
2017-10-23 14:08



अभी भी मेरा पर grep दिखाता है ... - Kevin
हाँ, यह मेरे लिए ओएस एक्स पर काम करता है। - Steve Bennett
लिनक्स पर इतना अच्छा काम नहीं करता है। - A-B-B
अधिक आम तौर पर, विकल्प ps कुख्यात रूप से गैर-पोर्टेबल हैं, इसलिए इस प्लेटफॉर्म के बारे में जानकारी के बिना, यह उत्तर बहुत उपयोगी नहीं है। इसके अलावा, यह स्पष्ट रूप से पर्याप्त नहीं है जब आप सुनिश्चित नहीं हैं कि जिस प्रक्रिया को आप ढूंढ रहे हैं वह एक प्रक्रिया नेता नहीं है (यानी यह आपकी मदद कर सकता है यदि आपका लक्ष्य एक डिमन है, लेकिन आम तौर पर अन्यथा नहीं)। - tripleee