विशिष्ट एक के अलावा सभी प्रक्रियाओं को कैसे मारें


13

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

विधि 1: - kill -9 $Pid (प्रत्येक प्रक्रिया के लिए एक-एक करके, जो समय लेने वाली है)

विधि 2: - killall -9 java(सभी प्रक्रियाओं के लिए - आसान है, लेकिन ग्रहण को अनावश्यक रूप से मार दिया जाएगा)

विधि 2 के मामले में ग्रहण भी मारा जाएगा, जो मैं कभी नहीं चाहता। क्या इसका कोई रास्ता है? मुझे यकीन है कि वहाँ होना चाहिए: पी

संपादित करें: मैं ubuntu 15.04 का उपयोग कर रहा हूं।


क्या आप Openjdk का उपयोग कर रहे हैं?
Maythux

नहीं, यह जावा-7-अलंकृत है
अतीक

मेरे जवाब की जांच करें
Maythux

जवाबों:


17

इस आदेश को आजमाएं:

ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

यह जावा से युक्त सभी प्रक्रियाओं की खोज करेगा और फिर ग्रहण को मार देगा


3
++ 1 अंधाधुंध उपयोग नहीं करने के लिए -9। आपको कभी भी किसी प्रक्रिया को इनायत से बाहर निकलने का मौका देना चाहिए।
रोमानो

pgrepइससे बेहतर है ps | grepकि आप खुद grep स्टेटमेंट को मारने का जोखिम उठाएं।
abligh

2
@ बार-बार समस्या यह है कि pgrepआप अंतर नहीं कर पा रहे हैं कि कौन सी प्रक्रियाएं चल रही हैं, क्योंकि यहां तक pgrep -lकि सिर्फ रिपोर्ट होगी java। @ Maythux, केवल संदर्भ के लिए, egrepपदावनत किया जाता है और इसका उपयोग नहीं किया जाना चाहिए, क्योंकि grep -Eबिल्कुल वैसा ही है, हालांकि आपको तब भी ज़रूरत नहीं है grep -Eजब से आप एक निश्चित स्ट्रिंग मिलान कर रहे हैं; तो बस grep -v "eclipse"(या यदि आप फैंसी बनना चाहते हैं [...] | grep -F "java" | grep -vF "eclipse | [...]")
kos

@kos: अप्रयुक्त:pkill '/java\(.*eclipse\)\@!'
abligh

@ क्या है \@!? यदि यह एक पर्ल-इस्म है तो यह काम नहीं करने वाला है, क्योंकि pkillकेवल ईआरई का समर्थन करता है, मैंने इस पूरे कार्य को pkillनकारात्मक लुकहैड्स के साथ पहले से ही उपयोग कर रहे एक आदेश को कम करने की कोशिश की है और इस कारण से विफल रहा है।
कोस

12

का उपयोग करते हुए awk

ps ax | awk '/java/ && !/eclipse/ {system("kill "$1)}'

आदेश सभी javaप्रक्रियाओं को मारता है, लेकिन प्रक्रिया नहीं eclipse


3
अधिक सुरुचिपूर्ण (और तेज़) तो @maythux IMHO से जवाब ... ;-)
Fabby

मैं Fabby के साथ सहमत हूँ, अच्छा!
कोस

1

कैसा रहेगा :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'के लिए खोजों javaप्रक्रियाओं और उन्हें सूची से भरा कमांड लाइन में

  • grep -Po '^[^ ]+(?!.*eclipse)'खोज की गई प्रक्रियाओं में से एक को देखता है और उन प्रक्रियाओं की आईडी प्राप्त करता है जो eclipseउनकी पूर्ण कमांड लाइनों में नहीं है

  • xargs kill प्रक्रियाओं को मार देगा।


एक छोटे और सुरुचिपूर्ण समाधान के लिए +1। ध्यान दें कि pkillयदि pgrep/pkillप्रति सेकंड ऊपर दिए गए चरण में उपयोग किया जाता है, तो यह और भी अधिक कुशल (केवल एक कमांड :) समाधान के लिए संभव है । दुर्भाग्य से pgrep/ pkillकेवल विस्तारित- regexps (जैसे egrep/grep -E) का समर्थन करते हैं ।
अरीफ

@ यार तुम बिलकुल सही हो..यह पीसीआरई का समर्थन करता pgrep/ pkillकरती तो सबसे ज्यादा कुशल होती ..
heemayl

0

jps -m | grep -v eclipse | awk '{print $1}' | xargs -t kill

यह सुनिश्चित करने के लिए jps का उपयोग करें कि आप सिर्फ java कमांड की तलाश कर रहे हैं और उन सभी कमांड्स की नहीं जो java के पाथ में हैं।


0
ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

1
यह आदेशों की व्याख्या करने के लिए अच्छा होता, बल्कि यह कि वे एक क्रिप्टोकरंसी स्ट्रिंग देते हैं। इसके अलावा, मेरे लंबे समय से चल रहे कमांड "orkjavagoob.sh" के बारे में क्या है
वॉल्टिनेटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.