यदि प्रक्रिया चल रही है तो केवल कैसे मारें?


14

वर्तमान में मैं अपनी sh स्क्रिप्ट फ़ाइल में इस तरह लाइन का उपयोग करता हूं:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

लेकिन मुझे आश्चर्य है कि इसे कैसे कॉल करें यदि प्रक्रिया ( myServerयहां) चल रही है?


killकेवल तभी कॉल करना असंभव है जब प्रक्रिया चल रही हो, क्योंकि परीक्षण और आह्वान के बीच दौड़ की स्थिति है kill(यह संभव है कि उस कम समय में किसी अन्य कारण से प्रक्रिया बंद हो गई है)। आपको उपयोग करना चाहिए pkillया killallजो बिल्कुल वही करते हैं जो आप करने की कोशिश करते हैं, लेकिन कम से कम टाइप करने के लिए (और शायद कुछ अन्य फायदे भी)।
JanC

जवाबों:


20

मैं आमतौर पर बस pgrep और pkill का उपयोग करता हूं

if pgrep myServer; then pkill myServer; fi

7
क्यों pkill myServerया नहीं killall -q myServer? लगातार प्रक्रियाओं को मारने का प्रयास करने के लिए कोई नकारात्मक पहलू नहीं है।
डेविड फ़ॉस्टर

12
यह 0 से बाहर नहीं होगा यदि मारने की कोई प्रक्रिया नहीं है, तो यह स्क्रिप्ट को तोड़ सकता है।
15

6
|| trueतब अपेंड करें ।
डेविड फोस्टरस्टर

यह सच है, लेकिन आपके पास प्रक्रिया को पहले से ही मृत बताने के लिए आपको और जोड़ने की लचीलापन नहीं होगी।
1655 को बॉच 55555

किस बारे में if ! killall -q myServer; then echo ERROR; fi?
डेविड फ़ॉस्टर

9

आप नाम का उपयोग करके प्रक्रियाओं को मार सकते हैं pkillया killall, उनके मैन पेज की जांच कर सकते हैं।


हां, इसके विपरीत kill, यह तभी मारता है जब प्रक्रिया चल रही हो। उदाहरण के लिएpkill -u myuser -f myprocess\.[0-9]+
चेस टी।

6

थोड़ा अलग दृष्टिकोण कुछ इस तरह होगा:

killall PROCESS || echo "Process was not running."

यह 1त्रुटि-कोड killallकमांड से लौटाया जाएगा , अगर प्रक्रिया मौजूद नहीं थी। echoहिस्सा केवल कार्रवाई में आ जाएगा अगर, killallरिटर्न 1, जबकि खुद को वापस आ जाएगी 0(सफलता)।


5
उपयोग करना killall -qबेहतर है
अनवर

1
चेतावनी, killall -qसभी यूनिक्स स्वादों पर समर्थित नहीं है, macOS कैटालिना अभी भी नहीं है।
tresf

0

प्रयोग करके देखें:

sudo kill `pidof process_name`

जहाँ process_name उस प्रक्रिया का नाम है जिसे आप मारना चाहते हैं। इसके बारे में बहुत अच्छी बात यह है कि पिडोफ, दिए गए नाम से मेल खाते सभी प्रक्रियाओं की सूची देगा। चूंकि मारना कई पिड को स्वीकार करता है, यह उन सभी को एक ही चक्कर में मार देगा।

मुझे बताएं क्या इससे मदद मिलती है।


क्या होगा अगर सूची खाली है? (मेरा मुख्य बिंदु यदि संभव हो तो मार को बुलाना नहीं था)
myWallJSON

1
यदि सूची खाली है, तो किल एक त्रुटि कोड 1 लौटाएगा और कुछ भी नहीं मार देगा। यह किसी भी दलील के साथ मारने की कोशिश करने के बराबर होगा। आप एक बयान जोड़ सकते हैं जो पहले जांचता है कि क्या पिडोफ एक खाली सूची देता है। यदि यह एक खाली सूची नहीं देता है, तो कॉल करें kill `pidof process_name। यदि यह एक खाली सूची लौटाता है, तो किल कॉल को छोड़ दें।
12

0

लघु स्क्रिप्ट मैंने आर एंड डी के साथ बनाई है। आशा है तुम्हें यह पसंद आएगा

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

इसे script.sh जैसे किसी नाम से सहेजें

chmod +x script.sh
./script.sh

फिर अपनी प्रक्रिया का नाम दें।

नोट: मैंने इसके और इसके जुर्माने को लेकर कई बार कोशिश की है।


क्या मुझे पता है कि इस स्क्रिप्ट और-वोट के साथ क्या गलत है, कृपया स्पष्टीकरण की आवश्यकता है।
r --dʒɑ

इस स्क्रिप्ट में कुछ भी गलत नहीं है ... +1
WinEunuuchs2Unix

0

जाँच करें कि क्या प्रक्रिया मौजूद है pidof। अगर यह करता है, इसे मार डालो:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

उपरोक्त आदेश निष्पादित करने के बाद बाहर निकलें कोड हमेशा 0 होता है।


0

pkillविकल्प के साथ प्रयोग करें-f

pkill -f myServer

विकल्प -fवह पैटर्न है जो सामान्य रूप से प्रक्रिया के नाम से मेल खाता है।


-1

मै इस्तेमाल करूंगा:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

xargs -rमार चलाने के लिए तभी इनपुट है बताता है। ps --no-header -eo pid,cmdपार्स के लिए एक बेहतर प्रारूप में उत्पादन हो जाता है।

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