2009-04-03 8 views
5

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

root#ps -e |grep 'java' 
18179 pts/0 00:00:43 java 

हम जानना चाहते हैं कि इसके बाद के संस्करण उत्पादन पार्स और यह एक खोल चर में प्राप्त करने के लिए तो हम नीचे के रूप में मार आदेश का उपयोग कर सकते हैं।

kill -9 ${processid} 
wait 10 

Note1: कारण है कि हम सामान्य सेवा रोक आदेश पर भरोसा नहीं कर सकते है, क्योंकि प्रक्रियाओं कभी कभी मरने के लिए नहीं चाहता है। और हमें मैन्युअल रूप से हत्या आदेश का उपयोग करना होगा।

+0

पिक्ल के बारे में क्या? –

उत्तर

4

रहे हैं इस को हल करने के विकल्पों में से एक जोड़े। यदि आप बैश का उपयोग कर रहे हैं, तो खोल चर '$!' अंतिम फोर्क-ऑफ बाल प्रक्रिया का पीआईडी ​​होगा।

echo $! > /var/run/my-process.pid 

फिर, अपने init स्क्रिप्ट जावा प्रक्रिया बंद हो जाता है के बाद:

# Get the pidfile. 
pid=$(cat /var/run/my-process.pid) 

# Wait ten seconds to stop our process. 
for count in $(1 2 3 4 5 6 7 8 9 10); do 
    sleep 1 
    cat "/proc/$pid/cmdline" 2>/dev/null | grep -q java 
    test $? -ne 0 && pid="" && break 
done 

# If we haven't stopped, kill the process. 
if [ ! -z "$pid" ]; then 
    echo "Not stopping; terminating with extreme prejudice." 
    kill -9 $pid 
fi 

pidfile दूर करने के लिए यह करने के बाद सुनिश्चित करें तो, के बाद आप अपने जावा प्रोग्राम प्रारंभ करते हैं, की तरह कुछ है।

ps aux आप

grep java आप प्रक्रियाओं जिनके नाम और आदेश पंक्ति तर्क स्ट्रिंग "जावा"

वाले साइट के सभी देता है सभी प्रक्रियाओं की एक सूची देता है:

+1

"प्रीजुसाइड"? क्या यह एक मजाक या टाइपो है? –

+0

यह तब होता है जब मैं सुबह कॉफी से पहले उत्तर पोस्ट करता हूं। –

+0

इसके अलावा, अगर आपको 'seq' कमांड मिला है, तो आप मैन्युअल गणना के बजाय 'seq 1 10' कर सकते हैं। लिनक्स के हर स्वाद पर हमेशा उपलब्ध नहीं है, हालांकि। –

0

यह की हत्या:

ps -e | grep java | cut -f1 -d' ' | xargs kill -9 

चर पर पीआईडी ​​भंडारण:

export JAVAPID=`ps -e | grep 'java' | cut -f1 -d' '` 

जाँच है कि यह काम किया:

echo $JAVAPID 
3
ps aux | grep java | awk '{print $1}' | xargs kill -9 

यहाँ व्याख्या दी गई है awk '{print $1}' grep कमांड के आउटपुट को व्हाइटस्पेस द्वारा कॉलम में पार्स करता है और केवल पहले कॉलम को री-प्रिंट करता है

xargs kill -9 एक मार -9 आदेश को पैरामीटर के रूप में awk आदेश के परिणामों में से प्रत्येक से गुजरता

+2

grep छोड़ें: ps aux | अजीब '/ जावा/{प्रिंट $ 1}' :) – andri

+0

टिप के लिए धन्यवाद; मुझे यह जानने के लिए काफी अच्छा नहीं पता कि यह कैसे करना है। मैं अपना जवाब छोड़ दूंगा क्योंकि यह मेरे लिए व्यक्तिगत रूप से समझना आसान है, लेकिन मुझे खुशी है कि आपने यह सुझाव दिया है। –

+1

क्या आपके पास grep-p gid एकत्र करने से रोकने के लिए वहां कोई grep -v grep नहीं होना चाहिए (क्योंकि इसकी कमांडलाइन में जावा शब्द है)? –

1

आप आसानी से केवल पुनः प्राप्त करने के बैकटिक और कटौती (या awk अगर वरीय) का उपयोग कर एक चर में पीआईडी ​​या PIDs की सूची प्राप्त कर सकते हैं पीआईडी ​​फ़ील्ड:

[[email protected] ~]$ ps -e | grep java | cut -d' ' -f1 
12812 
12870 
13008 
13042 
13060 

उपर्युक्त उदाहरण में नोट मेरे पास एकाधिक जावा प्रक्रियाएं चल रही हैं इसलिए एकाधिक मान।तुम इतनी तरह एक चर में इस सहेजते हैं:

JAVA_PROCS=`ps -e | grep java | cut -d' ' -f1` 

आप उन्हें मारने के लिए प्रक्रियाओं के माध्यम से पुनरावृति कर सकते हैं अगर वांछित:

for proc in $JAVA_PROCS; do 
    kill -9 $proc; 
done 
बेशक

, यदि आप केवल एक प्रक्रिया को पुन: प्राप्त कर रहे हैं, तो वहाँ पुनरावृति करने की कोई जरूरत है और आप बस के रूप में चला सकते हैं:

kill -9 $JAVA_PROCS 
1

तो आप क्या सुझाव है करते हैं, आप ग्रेप खुद पर कब्जा करने और उस की हत्या (के बाद से अपने ग्रेप आदेश जावा स्ट्रिंग है कि आप की गिरफ्तारी में शामिल हो सकती ई खोज रहे हैं)। आप इस के आसपास ग्रेप को निकालते हुए काम कर सकते हैं (एक और ग्रेप का उपयोग करके!):

pid=`ps -e | fgrep java | fgrep -v grep | awk '{print $1}'` 
# check pid has a value 
# kill $pid 

तुम भी ps -e -opid,args पसंद कर सकते हैं।

pgrep(1) या pkill(1) का उपयोग करने के लिए बेहतर विकल्प है यदि आपके सिस्टम में है। कोई और अधिक पाइप, SEDS, awks, कटौती, xargs:

pkill -9 java 
+0

मैंने लगभग एक ही चीज़ पोस्ट की है, लेकिन पीएस-सीएमडी तर्कों (कम से कम मेरे बॉक्स पर) सूचीबद्ध नहीं है, इसलिए grep आउटपुट में 'grep java' कमांड को गलती से कैप्चर करने का कोई खतरा नहीं है। – Jay

+0

स्पॉट ऑन, जे, कम से कम लिनक्स के लिए। मैं अभी भी पिक्ल पसंद करता हूं लेकिन ऐसा लगता है कि मैं अल्पसंख्यक हूं। –

+0

आप grep [j] ava में grep में पहले char के चारों ओर ब्रैकेट भी चिपका सकते हैं grep एक regex के रूप में देखता है और एक जे के लिए देखता है, लेकिन कमांड लाइन पैटर्न से मेल नहीं खाती है। :) जब मैं ऐसा करता हूं तो यह मुझे गंदा महसूस करता है, लेकिन यह अच्छी तरह से काम करता है ... – dannysauer

0

मैं कुछ इस तरह का उपयोग करें:

kill $(ps -A | grep java | cut -b 1-5) 
2

मुझे पता है यह पुराना है, लेकिन क्या बारे में:

pidof java | xargs kill