प्रक्रिया सूची से grep को छोड़कर


27

मैंने एक रनिंग डेमॉन की प्रक्रिया आईडी को वापस करने के लिए एक साथ एक आदेश दिया है:

ps aux | grep daemon_name | awk "{ print \$2 }"

यह पूरी तरह से काम करता है और PID को लौटाता है, लेकिन यह एक दूसरा PID भी लौटाता है जो संभवत: इस प्रक्रिया है जिसे मैं अभी चला रहा हूं। क्या कोई ऐसा तरीका है जिससे मैं अपने आदेश को लौटाए गए पीआईडी ​​की सूची से बाहर कर सकता हूं?

मैंने इसे कुछ बार परीक्षण किया है और ऐसा प्रतीत होता है कि मेरी कमान हमेशा सूची में दूसरी पीआईडी ​​है, लेकिन मैं गलत होने पर पहले पीआईडी ​​को हड़पना नहीं चाहता।


जवाबों:


27

grep का -vस्विच परिणाम को उलट देता है, इसे कतार से बाहर करता है। तो इसे ऐसे बनाएं:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

अद्यतन । आप -Cकमांड का नाम निर्दिष्ट करने के लिए स्विच का उपयोग भी कर सकते हैं :

ps -C daemon_name -o pid=

उत्तरार्द्ध -oयह निर्धारित करता है कि आप प्रविष्टि में कौन सी जानकारी चाहते हैं। pidकेवल प्रक्रिया आईडी कॉलम को सूचीबद्ध करता है। और इसके =बाद के बराबर चिह्न pidउस एक के लिए कोई कॉलम शीर्षक नहीं होगा, इसलिए आपको केवल स्पष्ट संख्याएं मिलती हैं - पीआईडी।

उम्मीद है की यह मदद करेगा।


2
"Grep -v grep" का उपयोग करना: बस ध्यान रखें कि आपके पास "grep" सहित एक लंबी कमांड लाइन हो सकती है (मान लीजिए कि किसी ने grep लाइब्रेरी लिखी है => "-Llibgrep.so" या "-cb libgrep.jar"। कम से कम। मैं पैटर्न को दोहराऊंगा: grep -v "grep daemon_name"
phil_w

अच्छी बात है, @phil_w, धन्यवाद। उत्तर अपडेट किया गया।
सर्ग ikS

23

आप एक चरित्र वर्ग चाल का उपयोग कर सकते हैं। "डी" "मेल नहीं खाता" [डी] "केवल" डी "।

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

मैं इस का उपयोग करने के लिए पसंद करते हैं | grep -v grep


हेह एक चतुर चाल है, मुझे यह पसंद है। मैं इस समय चीजों को सरल रख रहा हूं, हालांकि मैं सीख रहा हूं, और | grep -v grepजब मैं अपना कोड दोबारा लिखूंगा, तो समझना आसान होगा।
टेक

मैं यह समझने की कोशिश कर रहा हूं कि यह [h] ack कैसे काम करता है। क्या आप बता सकते हैं कि आपका क्या मतलब है "[d]" does not match "[d]" only "d"?
नोवेकर

@Damian: वर्ग कोष्ठक हैं अक्षरों से परे खोज एक्सप्रेशन के (अक्षर का एक सेट परिसीमन) तो grepआदेश से मेल नहीं खाएगी psके लिए उत्पादन लाइन grepआदेश ही (क्या मूल प्रश्न में "एक दूसरी पीआईडी" कहा जाता है तक)। अभिव्यक्ति a[xy]dकरता नहीं पाठ से मेल a[xy]dलेकिन यह मैच पाठ करता है axdया पाठ ayd। इसलिए अभिव्यक्ति [f]ooपाठ से मेल खाती है fooलेकिन पाठ से नहीं [f]oo। मुझे उम्मीद है यह स्पष्ट है।
RedGrittyBrick 21

ठीक है, मैं ARGV के बारे में गलत था। यह सिर्फ एक regexp है। धन्यवाद।
Nowaker

शैतानी चालाक! एक पल के लिए इसके बारे में सोचना पड़ा - धन्यवाद!
उपफूज़न

15

psअधिक विश्वसनीय विकल्प होने पर पार्सिंग के आउटपुट से बचें ।

pgrep daemon_name
pidof daemon_name

अंत में, प्रक्रिया प्रबंधन अब समझ में आता है।
बलोएज माइकेल

pgreppidofसटीक मिलान करते समय विकल्प द्वारा खोज - मुझे क्या ज़रूरत थी! धन्यवाद!
साशा

3

ps -Cविकल्प सभी यूनिक्स आधारित सिस्टम पर सार्वभौमिक नहीं है लेकिन अगर यह आपके सिस्टम पर काम करता है। इसके बजाय मैं पूरी तरह से बचना होगा:

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

एकल उद्धरण चिह्नों में कुछ भी बचने की आवश्यकता नहीं है। ps auxआपको अधिकांश यूनिक्स आधारित प्रणालियों पर प्रक्रियाओं की पूरी सूची देगा और awkआम तौर पर डिफ़ॉल्ट रूप से स्थापित किया जाता है।


3

pgrepनाम से एक प्रक्रिया की पिड देखने के लिए उपयोग करें :

pgrep proc_name

परिणाम में अतिरिक्त प्रक्रिया नाम के साथ ( -l):

pgrep -l proc_name

प्रक्रिया नाम -lऔर (और तर्क) देखें और देखें -f:

pgrep -lf proc_name_or_argument

अच्छी बात pgrepयह है कि यह कभी भी मैच के रूप में खुद को रिपोर्ट नहीं करेगा। लेकिन आपको इसके द्वारा पिड प्राप्त करने की आवश्यकता नहीं है pgrepऔर फिर इसके द्वारा संबंधित प्रक्रिया को मारें killpkillइसके बजाय उपयोग करें :

pkill proc_name

(डिफ़ॉल्ट रूप से) के बजाय SIGKILLसंकेत ( -9या -KILL) निर्दिष्ट करें SIGTERM:

pkill -9 proc_name

सिग्नल ( या ) द्वारा इसे मारने से पहले प्रक्रिया का नाम ( -l) और तर्क ( -f), पुष्टि के लिए पूछें ( ) देखें:-ISIGKILL-9-KILL

pkill -KILL -Ilf proc_name_or_argument

ध्यान दें कि -Iविकल्प केवल कुछ संस्करणों पर उपलब्ध है pkill, जैसे OS X Mavericks पर।


0

यदि आप बैश का उपयोग कर रहे हैं, तो आप निम्न तरीके से भी इसका उपयोग करके कर सकते हैं ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

यह अनावश्यक रूप से जटिल है। बस फोन क्यों नहींps -eaf | grep "process_name" | awk '{print $2}'
डेविड नेडरो

0

यह लाइन आपको "grep" को छोड़कर pid (प्रोसेस आईडी) वापस देती है

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)

कुछ स्पष्टीकरण अच्छा होगा।
davidbaumann

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