प्रक्रिया को मारने का सुंदर तरीका


12

मेरी बैश स्क्रिप्ट को सेलेनियम सर्वर के साथ करने के बाद, स्क्रिप्ट इसे इस तरह मारती है:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

जबकि यह काम करता है और यह सेलेनियम स्क्रिप्ट को मारता है, यह प्रक्रिया के लिए grep seleniumसमय को मारने की कोशिश भी करता है, जब तक कि प्रक्रिया संख्या वापस किल कमांड पर पहुंच जाती है, प्रक्रिया समाप्त हो जाती है, इसलिए यह एक त्रुटि संदेश उत्पन्न करता है। (दूसरे शब्दों में: यह दो प्रक्रियाओं को समाप्त करता है, उनमें से एक असली सेलेनियम सर्वर है, दूसरा एक क्षणभंगुर प्रक्रिया है जो इस आदेश का एक साइड-इफेक्ट है कि मैं यह कैसे कर रहा हूं।)

इस प्रक्रिया को मारने के लिए एक और अधिक सुंदर तरीका है, कि यह अनपेक्षित दुष्प्रभाव नहीं है?

(FWIW एक विचार मेरे पास था: यह एक ही स्क्रिप्ट पहले सेलेनियम को स्क्रिप्ट में शुरू करता है, इसलिए हो सकता है कि अगर मैं सेलेनियम शुरू करने पर पीआईडी ​​पर कब्जा कर सकता हूं, तो मैं इसे रख सकता हूं और इसे सीधे मार सकता हूं, बजाय इसके लिए सीधे प्रक्रिया आईडी। समस्या यह है, मुझे नहीं पता कि उस पीआईडी ​​को कैसे प्राप्त करें, इसे रखने के लिए एक चर का उपयोग कैसे करें और इसे बाद में स्क्रिप्ट में कैसे संदर्भित किया जाए। लेकिन क्या यह इसके बारे में जाने का एक बेहतर तरीका है?)

जवाबों:


12

pkill seleniumयह न तो उपयोग करने की कोशिश करें, और न ही दूसरों में से कोई एक काम जिसे आप अपनी विधि का उपयोग किसी अन्य पाइप अनुक्रम के साथ रख सकते हैं जैसे कि

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`

pkill इसके लिए मेरे सर्वर पर काम नहीं करता है, लेकिन आपकी बेहतर grep स्ट्रिप से बहुत मदद मिलती है।
एरिक

20

उस pgrepकमांड को आज़माएं , जिसमें आपकी रुचि के कमांड का पीआईडी ​​आउटपुट होगा।

pgrep selenium

वास्तव में प्रक्रिया को मारने के लिए, साथी pkillकमांड का उपयोग करें ।

pkill selenium

मुझे इसका लालित्य बहुत पसंद है, लेकिन यह प्रक्रिया कुछ इस तरह दिखती है: "रूट 26401 11997 2 23:20 पीटीएस / 1 00:00:00 जावा -जर / हॉम / एलएमएन / क्रोन / सेलेनियम -सर्वर-standalx-2.19.0। जार "तो मैं बस इसे बदल दिया है pgrep javaऔर यह काम करता है :-) धन्यवाद!
एरिक

2
यदि आप '-f' ध्वज को pgrep देते हैं, तो यह संपूर्ण कमांड-लाइन के खिलाफ पैटर्न से मेल खाएगा। तो, इस मामले में मार pgrep -f seleniumकाम करना चाहिए
mills013

7
उपयोग pkillकरना बहुत सरल है। pkillठीक उसी मिलान मापदंड का उपयोग करता है pgrep, जैसा कि आप 2 के बजाय 1 कमांड में कर सकते हैं (और एक के आउटपुट पर भरोसा करने के लिए)।
पैट्रिक

7

प्रयोग करके देखें grep [s]elenium। यह grep प्रक्रिया नहीं ढूंढेगा।


यह वास्तव में एक आसान ट्रिक है। यह काम क्यों करता है?

2
@hesse - grepडिफ़ॉल्ट रूप से BRE का उपयोग करता है। यह है, [और के लिए ]दिखाने के argvलिए grep, लेकिन यह मेल नहीं खाता क्योंकि [और ]सचमुच द्वारा उपयोग नहीं किया जा रहा है grep
क्रिस डाउन

मैंने अक्सर | grep -v grepपाइप में एक घटक का उपयोग किया है । लेकिन यह बहुत सुंदर है और मुझे यह पसंद है!
अलेक्सियो

यह (अक्सर) पर्याप्त नहीं है यदि आपके पास वर्तमान कार्यशील निर्देशिका में उसी नाम के साथ एक फ़ाइल है जिस प्रक्रिया के लिए आप तैयारी कर रहे हैं। इसलिए, मैं आमतौर पर जिस समाधान का उपयोग करता हूं वह है ps -ef | grep \[s]elenium:। हालांकि मुझे lsofउपयोग करने के लिए psऔर बेहतर विकल्प मिला grep
मोरकी जू

2

killallआदेश में उल्लेख किया है नहीं किया गया है, और मुझे लगता है यह प्रदर्शनों की सूची के लिए एक उपयोगी है।

$ killall selenium

आप -r regexप्रक्रिया नाम से मेल खाने के लिए एक नियमित अभिव्यक्ति निर्दिष्ट करने के लिए विकल्प का उपयोग भी कर सकते हैं , और एक समय मूल्य भी:

$ killall -o 5m selenium 

5 मिनट से अधिक पुराने सभी सेलेनियम प्रक्रियाओं को मारता है।


यह गैर- killall
आरएचईएल

0

-m 1केवल पहली पाया प्रक्रिया लाने के लिए grep कमांड के साथ स्विच का उपयोग करें । जब तक आप पीआईडी ​​द्वारा अपनी प्रक्रियाओं को क्रमबद्ध करते हैं, आरोही, यह काम करेगा।


1
आप यह सुनिश्चित नहीं कर सकते कि सेलेनियम प्रक्रिया एक कम पीआईडी ​​का उपयोग कर रही है।
फजरा

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