2013-02-25 81 views
5

तो मुझे लगता है कि kill is not a synchronous आदेश हाल ही में सीखा है, तो मैं पार्टी में इस जबकि पाश है, जो भयानक है उपयोग कर रहा हूँ:बैश: थोड़ी देर के पाश अंदर काउंटर (मारने और मारने -9)

while kill PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done 

हालांकि , ऐसे मामले हैं (बहुत दुर्लभ, लेकिन वे अभी भी होते हैं) जिसमें प्रक्रिया फंस जाती है, और यह हत्या संकेत पर कार्य नहीं करती है। इन मामलों में, ऐप को मारने का एकमात्र तरीका "kill -9" का उपयोग कर रहा है।

तो मैं सोच रहा हूं कि बैश में, ऊपर दिए गए लूप को कैसे -9 तर्क का उपयोग करने के लिए केवल तभी संशोधित किया जाएगा जब लूप 10 वें पुनरावृत्ति तक पहुंच गया हो?

+0

आपका प्रश्न क्या है? आप जानना चाहते हैं कि कैसे गिनना है? –

+0

मैं जानना चाहता हूं कि बैश में थोड़ी देर के अंदर काउंटर का उपयोग कैसे करें, मैं कोई बैश साक्षर नहीं हूं – knocte

+2

यदि आप जानना चाहते हैं कि बैश में काउंटर कैसे बनाएं, तो 'kill -9' के बारे में सवाल न करें। इससे गंभीर रूप से पानी खराब हो जाएगा, क्योंकि 'kill -9' आमतौर पर एक बुरा विचार है, और निश्चित रूप से * एक स्क्रिप्ट में एक बुरा विचार है। – kojiro

उत्तर

1

निश्चित रूप से, काउंटर का उपयोग करें, लेकिन यह थोड़ा हैम-मुट्ठी है।

आप शायद वास्तव में क्या करना चाहते हैं 0 अपने सिग्नल के रूप में उपयोग करें, जो प्रक्रिया के लिए कुछ भी नहीं करेगा, लेकिन यह जांचने दें कि प्रक्रिया अभी भी जिंदा है या नहीं। (kill -0 $pid प्रक्रिया मौजूद नहीं है, तो एक nonzero निकास स्थिति वापस कर देगा।) और फिर, आप जानते हैं, kill -9 यह नहीं है। प्रक्रिया किसी भी कारण से अटक नहीं जाती है, वे फंस जाते हैं क्योंकि वे संसाधन को जाने नहीं दे सकते हैं, जैसे नेटवर्क या फाइल सिस्टम अवरुद्ध होने पर। ब्लॉक को हल करें, फिर प्रक्रिया स्वयं के बाद साफ हो सकती है।

+0

के आसपास दो प्रश्न होने के लिए उपयोगी हो सकता है, क्या आप 0 सिग्नल पर थोड़ा और विस्तार कर सकते हैं? मुझे अभी भी मारने और मारने के बीच अंतर नहीं मिला -0 – knocte

+0

@knocte 'kill -0' प्रक्रिया में कुछ भी नहीं करता है अगर उसे कोई मिलता है। यह सिर्फ आपको यह बताने देता है कि यह वहां है। इस बारे में सोचें कि प्रक्रिया को पिंग करने के लिए यह देखने के लिए कि क्या यह अभी भी जीवित है या नहीं। – kojiro

+0

लेकिन सादा मार (बिना -0) भी शून्य स्थिति को वापस लौटाता है यदि यह अस्तित्व में नहीं है, तो यह वास्तव में कुछ भी सुधार नहीं करता है – knocte

1

एक बार सिग्नल भेजने के लिए पर्याप्त है।

kill $PID 2>/dev/null 
sleep 10; 
if kill -0 $PID 2>/dev/null 
    kill -9 $PID 
fi 

अपने काउंटर सवाल के लिए:

c=0 
while true; do 
    echo $c; 
    c=$((c+1)); 
    if [ $c -eq 10 ]; then break; fi; 
done 
+0

पर टकराने वाले दो नए गाइड की तरह मैंने 10 वें पुनरावृत्ति को कहा, 10 सेकंड – knocte

+0

अपडेट नहीं किया ........ –

+0

ठीक है, अगर आप दोनों में कोड ब्लॉक को गठबंधन करते हैं तो मैं ऊपर हट जाऊंगा :) – knocte

2

के रूप में अन्य उपयोगकर्ताओं ने कहा .... आप उपयोग करने से पहले ब्लॉक इस क्रूर विधि का कारण ठीक करने के लिए ... वैसे भी है ... यह कोशिश

#!/bin/bash 

i=0 

PID_OF_THE_PROCESS="your pid you can set as you like" 

# send it just once 
kill $PID_OF_THE_PROCESS 2>/dev/null; 

while [ $i -lt 10 ]; 
do 
    # still alive? 
    [ -d /proc/$PID_OF_THE_PROCESS ] || exit; 
    sleep 1; 
    i=$((i+1)) 
done 

# 10 iteration loop and still alive? be brutal 
kill -9 $PID_OF_THE_PROCESS 
+0

'PID_OF_THE_PROCESS' होना चाहिए चर? – kojiro

+0

यह लगभग है जो मैं प्राप्त करना चाहता हूं! 10 वीं – knocte

+0

@knocte से पहले पिछले पुनरावृत्तियों में "मारने" के लिए कॉल केवल गायब है, यदि आप एक बार SIGTERM भेजते हैं, तो यह समाप्त हो जाएगा। इसे 9 और बार भेजना व्यर्थ है। – kojiro

0

वहाँ इस लक्ष्य को हासिल करने के लिए कई तरीके हैं, लेकिन आप अपने मौजूदा पाश संशोधित करने के लिए पूछना था, इसलिए:

count=0 
while kill PID_OF_THE_PROCESS 2>/dev/null 
do 
    sleep 1; 
    ((count++)) 
    if ((count > 9)) 
    then 
     kill -9 PID_OF_THE_PROCESS 2>/dev/null 
    fi 
done 
+0

क्या आप एन पुनरावृत्ति में प्रक्रिया को मारने के लिए सिर्फ एक एलिफ जोड़ सकते हैं यदि गिनती <10? – knocte