2009-06-04 14 views
7

में हत्या प्रक्रिया - मुझे एक बहुत ही सरल समस्या है: जब मैं एक शेल स्क्रिप्ट चलाता हूं तो मैं एक प्रोग्राम शुरू करता हूं जो एक अनंत लूप में चलता है। कुछ समय बाद मैं इस कार्यक्रम को रोकना चाहता हूं इससे पहले कि मैं इसे फिर से विभिन्न पैरामीटर के साथ कर सकूं। सवाल यह है कि जब मैं इसे निष्पादित करता हूं तो प्रोग्राम को के पिड को कैसे पता चल सकता है? असल में, मैं ऐसा कुछ करना चाहता हूं:शेल स्क्रिप्ट

echo "Executing app1 with param1" 
./app1 param1 & 
echo "Executing app1" 
..do some other stuff 
#kill somehow app1 
echo "Execution of app1 finished!" 

धन्यवाद!

उत्तर

2

आप

ps ux | awk '/app1/ && !/awk/ {print $2}' 

साथ APP1 की पीआईडी ​​प्राप्त और फिर आप इसे मारने के लिए .... (हालांकि, अगर आप APP1 के कई उदाहरण है सक्षम होना चाहिए, तो आप को मार सकता है ' एम सभी)

5

बैश $! पृष्ठभूमि में शुरू की गई अंतिम प्रक्रिया के पीआईडी ​​में फैलता है। तो अगर आप कर सकते हैं:

./app1 param1 & 
APP1PID=$! 
# ... 
kill $APP1PID 
+0

सभी उत्तर के लिए धन्यवाद, लेकिन यह मेरा पसंदीदा है! –

15

(बॉर्न और सी सहित) सबसे गोले में, पिछले उपप्रक्रिया की पीआईडी ​​आप पृष्ठभूमि में शुरू की विशेष चर $ में संग्रहीत किया जाएगा !.

#!/bin/bash 
./app1 & 
PID=$! 
# ... 
kill $PID 

विशेष चर अनुभाग के तहत some information here है।

3

यदि आप एक प्रक्रिया का पीआईडी ​​पता लगाना चाहते हैं, तो आप ps उपयोग कर सकते हैं:

[[email protected] ~]$ ps h -o pid -C app1 

पैरामीटर -o pid का कहना है कि आप केवल प्रक्रिया के पीआईडी, -C app1 का नाम निर्दिष्ट चाहते हैं कि जिस प्रक्रिया को आप क्वेरी करना चाहते हैं, और पैरामीटर h का उपयोग परिणाम तालिका के शीर्षलेख को दबाने के लिए किया जाता है (इसके बिना, आप पीआईडी ​​के ऊपर एक "पीआईडी" शीर्षलेख देखेंगे)। ऐसा नहीं है कि यदि एक ही नाम से एक से अधिक प्रक्रियाएं हैं, तो सभी पीआईडी ​​दिखाए जाएंगे।

यदि इस प्रक्रिया को मारने के लिए चाहते हैं, आप उपयोग कर सकते हैं:

[[email protected] ~]$ kill `ps h -o pid -C app1` 

हालांकि killall क्लीनर है अगर आप सिर्फ इतना है कि क्या करना चाहते हैं (और आप सभी "APP1" प्रक्रियाओं की हत्या कोई आपत्ति नहीं है, तो)। यदि आप क्रमशः केवल पहले या अंतिम पीआईडी ​​चाहते हैं, तो आप head या tail का भी उपयोग कर सकते हैं।

और fish उपयोगकर्ताओं के लिए एक टिप: %processprocess के पीआईडी ​​के साथ प्रतिस्थापित किया गया है। इसलिए, मछली में, आप इस्तेमाल कर सकते हैं:

[email protected] ~> kill %app1 
0

मैं एक समस्या है, जहां प्रक्रिया मैं मार रहा था एक अजगर स्क्रिप्ट था और मैं एक स्क्रिप्ट जो भी अजगर चल रहा था। मैं दूसरी लिपि की वजह से अजगर को मारना नहीं चाहता था।

मैं awk इस्तेमाल किया इस से निपटने के लिए (myscript अपने अजगर स्क्रिप्ट रहने दो): मारने ps -ef|grep 'python myscript.py'|awk '!/awk/ && !/grep/ {print $2}'

के रूप में कुशल नहीं हो सकता है, लेकिन मैं नहीं बल्कि इस तरह एक कार्य में बहुमुखी प्रतिभा के लिए दक्षता व्यापार चाहते हैं।

संबंधित मुद्दे