केवल एक जावा प्रक्रिया को मार डालो


17

मैं आमतौर पर कुछ जावा अनुप्रयोगों को चलाता हूं, एक स्थानीय रूप से चलने वाले सर्वर के लिए और दूसरा नेटबीन्स जैसे कुछ आईडीई के लिए। और समय-समय पर, बहुत सारे पुनर्वितरणों के बाद, मेरा सर्वर आउटऑफएममोरी एक्ससेप्शन पर अटक जाता है, इसलिए मुझे रिबूट करने के लिए जावा प्रक्रिया को मारने की आवश्यकता है।

इसलिए मैं करता हूं, pkill -9 javaलेकिन यह मेरी चल रही आईडीई को भी मारता है जो मैं नहीं चाहता। तो मैं केवल रनिंग सर्वर से जुड़े एप्लिकेशन को कैसे मारूं और अन्य लोगों को नहीं? मैं यह मानता हूं कि वे सभी एक ही प्रक्रिया के तहत चल रहे हैं, लेकिन किसी तरह से उन्हें परेशान करना है।


2
अपनी प्रक्रिया तालिका (के माध्यम topसे ps) देखें और सही चुनें और इसे पीआईडी ​​(मार -9 पीआईडी_नंबर) द्वारा मारें।
भीड़

अरे हाँ, अब मैं देख सकता हूँ। इसलिए मुझे सिर्फ सही के साथ प्रक्रिया को मारने की जरूरत है PID। बहुत बहुत धन्यवाद
पेट्र मेंसिक

मुझे इसे स्वचालित करने की आवश्यकता है। विशेष कार्यक्रम के लिए पीआईडी ​​कैसे प्राप्त करें?
निखिल वीजे

जवाबों:


24

एक प्रक्रिया को मारने के लिए, जो कई प्रक्रियाओं से जुड़ी है, आपको उस प्रक्रिया से जुड़ी प्रक्रिया आईडी का उपयोग करके उसे मारना होगा।

उस जावा प्रोसेस की प्रोसेस आईडी प्राप्त करने के लिए

ps -A |grep java

इस कमांड का आउटपुट आपके सिस्टम पर चल रही जावा प्रोसेस की सूची देगा। उस प्रक्रिया की प्रक्रिया आईडी (पीआईडी) नोट करें, जिसे आप मारना और चलाना चाहते हैं

kill -9 PID

यदि आप सभी java प्रक्रियाओं को एक कमांड द्वारा मारना चाहते हैंps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
Andrii Karaivanskyi

11

IMO सबसे अच्छा उपाय है:

pkill -9 -f <nameOfYourJavaAplication>

उत्तम। मैं प्रयोग किया जाता है ps -fC javaखोजने के लिए nameOfYourJavaAplication(में -Dprogram.name)
cactuschibre

8

उपयोग करने के बजाय psऔर grep, आप उपयोग कर सकते हैं psके -Cजावा 'नाम के साथ सूचीबद्ध सभी आदेशों का चयन करने के ध्वज'। तुम भी उपयोग कर सकते हैं psके -fप्रत्येक सूचीबद्ध प्रक्रिया का पूरा आदेश नाम मुद्रित करने के लिए झंडा। इस तरह, आप देख सकते हैं कि प्रत्येक जावा प्रक्रिया वास्तव में क्या कर रही है। यहाँ पूर्ण में आदेश है ps -fC java:।

आप pgrepसभी जावा प्रक्रियाओं को सूचीबद्ध करने के लिए भी उपयोग कर सकते हैं । pgrep -a javaपीआईडी ​​और प्रत्येक जावा प्रक्रिया की पूरी कमांड लाइन लौटाएगा।

एक बार जब आपके पास उस कमांड की PID हो, जिसे आप मारना चाहते हैं, killतो -9(SIGKILL) झंडे और जिस Pava प्रक्रिया को आप मारना चाहते हैं, उसका PID उपयोग करें । जब यह 'SIGTERM' सिग्नल प्राप्त करता है, तो Java हमेशा बंद नहीं होता है (प्रक्रियाओं को 'SIGTERM' को संभालने की अनुमति है), इसलिए इसे 'SIGKILL' सिग्नल भेजना, जो कि इनइट को प्रोग्राम को पहले चेतावनी दिए बिना मार देता है, अक्सर आवश्यक होता है।

उदाहरण के लिए, यदि ps -fC javaरिटर्न

UID        PID  PPID  C STIME TTY          TIME CMD
jeff      9014  8890  0 08:51 pts/0    00:00:00 java IDE
jeff     11775  8890  6 08:59 pts/0    00:00:00 java TestProgram

या psgrep -a javaलौटता है

9014 java IDE
11775 java TestProgram

और आप को मारना चाहते हैं java TestProgram, आपको भागना चाहिए kill -9 11775


1

यदि आप एक स्क्रिप्ट चाहते हैं और प्रोग्राम के कमांड लाइन से एक पैटर्न का उपयोग करके अपने (विशिष्ट) रनिंग प्रोग्राम को ढूंढ कर मार सकते हैं (और न केवल आपके द्वारा चलाए जा रहे हर जावा चीज़), तो:

pgrep -f pattern # shows the PID
pkill -f pattern

से /unix//a/31111/249209


सूचना है कि "pkill" पहले से ही उल्लेख किया गया था 13 फ़र, '13 के मारेक आर के जवाब में
जेफ स्कालर

0

jpsऔर jcmdकेवल जावा प्रक्रियाओं की जानकारी और पीआईडी ​​प्रदर्शित करने में विशेष उपकरण हैं।

आप अधिक विस्तृत आउटपुट के लिए उनके विकल्प तलाश सकते हैं।


वे केवल मेरे कंप्यूटर पर खुद को सूचीबद्ध करते हैं।
एलेक्सिस विल्के

फिर, क्या आप सुनिश्चित हैं कि अन्य जावा प्रक्रियाएं चल रही हैं?
मुहम्मद गालबाना

हाँ। आपके आदेश का परीक्षण करते समय मेरे पास कैसंड्रा या इलासद्र चल रहा था।
एलेक्सिस विलके

0

यहाँ एक स्क्रिप्ट है जिसका उपयोग प्रक्रिया को स्वचालित करने के लिए किया जा सकता है।

<PROCESS_NAME>जो भी जावा निष्पादित हो रहा है उस भाग को बदलें ।

#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}

नोट: मैंने नहीं डाला -9। जब तक आप सिग्नल पर कब्जा नहीं करते और SIGTERM(डिफ़ॉल्ट) विफल नहीं हो जाते तब तक मुझे इसकी आवश्यकता नहीं होनी चाहिए । मैं आपको संकेत नाम का उपयोग करने का भी सुझाव दूंगा, जो पढ़ने में आसान बनाता है:

kill -TERM ${process}

चेतावनी

निष्पादित करने से पहले kill ...सुनिश्चित करें कि $processचर उम्मीद के मुताबिक सेट हो गया है। ps -efUnices के बीच मई अलग तो awkएक अलग पैरामीटर मुद्रित करने के लिए आवश्यकता हो सकती है।

ध्यान दें

<PROCESS_NAME>एक चर में बदला जा सकता है। बस याद रखें कि अगर आपको इसे हर बार अपनी कमांड लाइन पर टाइप करना है, तो आपको एक बार गलती करने की संभावना है। मुझे सही नाम के साथ स्क्रिप्ट की एक से अधिक कॉपी करना आसान लगता है।

इसके अलावा महत्वपूर्ण: awkस्क्रिप्ट के लिए एकल उद्धरण नोटिस । इसका मतलब है कि आपको बीच में चर के साथ स्ट्रिंग को बंद करने और फिर से खोलने की आवश्यकता है। कुछ इस तरह से काम करना चाहिए (अप्राप्त):

process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.