Nohup प्रक्रिया को मारने के लिए प्रक्रिया ID कैसे प्राप्त करें?


204

मैं सर्वर पर एक nohup प्रक्रिया चला रहा हूँ। जब मैं इसे मारने की कोशिश करता हूं तो इसके बजाय मेरा पोटीन कंसोल बंद हो जाता है।

इस तरह से मैं प्रक्रिया आईडी खोजने की कोशिश करता हूं:

ps -ef |grep nohup 

यह मारने की आज्ञा है

 kill -9 1787 787

6
क्या आप इसे स्क्रिप्ट से या कमांड लाइन पर मारने की कोशिश कर रहे हैं? आपको या तो पीआईडी ​​को बचाने की आवश्यकता है जब आप इसे करते हैं nohupऔर बाद में इसके लिए इसका उपयोग करते हैं kill, या ps -efआउटपुट में इसके कमांड नाम से प्रक्रिया पाते हैं और उसी से पीआईडी ​​प्राप्त करते हैं। आपको कमांड नाम ढूंढना है, नहीं nohup
लूकर

1
@ मैं आपको टिप्पणी के बजाय एक उत्तर देना चाहिए।
अंसार विचर

@AnsgarWiechers सुझाव के लिए धन्यवाद। कभी-कभी अगर मेरी प्रतिक्रिया बहुत संक्षिप्त है, या यदि मुझे यकीन नहीं है कि यह पूरी तरह से कवर कर रहा है कि ओपी क्या पूछ रहा है, तो मैं इसे उत्तर के रूप में पोस्ट करने में संकोच कर रहा हूं। मैंने एक उत्तर जोड़ा है और अधिक जानकारी शामिल की है।
लूकर

जवाबों:


353

उपयोग करते समय nohupऔर आप कार्य को पृष्ठभूमि में रखते हैं, पृष्ठभूमि ऑपरेटर ( &) आपको कमांड प्रॉम्प्ट पर पीआईडी ​​देगा। यदि आपकी योजना प्रक्रिया को मैन्युअल रूप से प्रबंधित करने की है, तो आप उस PID को सहेज सकते हैं और बाद में प्रक्रिया को मारने के लिए उपयोग कर सकते हैं यदि आवश्यक हो, तो ( kill PIDया kill -9 PIDयदि आपको मारने के लिए मजबूर करने की आवश्यकता है)। वैकल्पिक रूप से, आप पीआईडी ​​को बाद में ढूंढ सकते हैं ps -ef | grep "command name"और वहां से पीआईडी ​​का पता लगा सकते हैं। ध्यान दें कि nohupकीवर्ड / कमांड स्वयं psआउटपुट के लिए कमांड में दिखाई नहीं देता है ।

यदि आप एक स्क्रिप्ट का उपयोग करते हैं, तो आप कुछ ऐसा कर सकते हैं:

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

यह my_commandसभी आउटपुट को my.logएक स्क्रिप्ट में सहेज कर चलेगा (एक स्क्रिप्ट में $!निष्पादित अंतिम प्रक्रिया के पीआईडी ​​का प्रतिनिधित्व करता है)। 2(मानक त्रुटि के लिए फ़ाइल की जानकारी देता है stderr) और 2>&1मानक आउटपुट (फ़ाइल वर्णनकर्ता के लिए रास्ते में मानक त्रुटि उत्पादन के लिए खोल बताता है 1)। इसकी जरूरत है&1 है कि शेल जानता है कि यह उस संदर्भ में एक फ़ाइल विवरणक है जिसका नाम केवल एक फ़ाइल है 12>&1किसी भी त्रुटि संदेश है कि सामान्य रूप से हमारे में मानक त्रुटि के लिए लिखा जाता कब्जा करने के लिए की जरूरत है my.logफ़ाइल (जो मानक आउटपुट से आ रही है)। शेल के साथ I / O पुनर्निर्देशन को संभालने के बारे में अधिक जानकारी के लिए I / O पुनर्निर्देशन देखें ।

यदि आदेश एक नियमित आधार पर आउटपुट भेजता है, तो आप कभी-कभी आउटपुट की जांच कर सकते हैं tail my.log, या यदि आप इसे "लाइव" का पालन करना चाहते हैं तो आप उपयोग कर सकते हैं tail -f my.log। अंत में, यदि आपको इस प्रक्रिया को मारने की जरूरत है, तो आप इसे कर सकते हैं:

kill -9 `cat save_pid.txt`
rm save_pid.txt

15
एक मामूली स्पष्टीकरण, यह nohupप्रति नहीं है, जो पीआईडी ​​प्रिंट करता है, यह अंतिम है &जो इसे पृष्ठभूमि देता है, उदाहरण के ls &लिए चलने के लिए पीआईडी ​​दिखाएगाls
कर्माकेज़

1
> 2> & 1 ’क्या करता है?
विराज

4
@ विराज 2"मानक त्रुटि" फ़ाइल विवरणक है। >शेल पुनर्निर्देशन है, और &1"मानक आउटपुट" फ़ाइल डिस्क्रिप्टर है ( &यहां इसकी आवश्यकता है, इसलिए शेल को नहीं लगेगा कि मैं किसी फ़ाइल का उल्लेख कर रहा हूं 1)। इसलिए 2 > &1किसी भी मानक त्रुटि आउटपुट को मानक इनपुट पर पुनर्निर्देशित करता है। चूंकि पूर्व > my.logमानक आउटपुट को पुनर्निर्देशित करने का मतलब है my.log, हमें यह सुनिश्चित करने के लिए एक तरीका चाहिए कि त्रुटि संदेश भी जाएं my.log2 > &1यह सुनिश्चित करता है कि ऐसी त्रुटियां मानक आउटपुट पर जाएं, जो बदले में जाती हैं my.logI / O पुनर्निर्देशन देखें ।
लूकर

6
echo $!इस प्रक्रिया के बदले मुझे नोहाप की पीडा दी गई
जे वानी

1
@Mvorisek &एक कमांड सीमांकक के रूप में कार्य करता है ताकि आप कोशिश कर सकें sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt",। यह काम कर सकता है, लेकिन मैंने इसकी कोशिश नहीं की है।
लूकर

91

मैं एक VPS सर्वर पर लाल टोपी का उपयोग कर रहा हूँ (और SSH - पोटीन के माध्यम से), मेरे लिए निम्नलिखित काम किया है:

सबसे पहले, आप सभी चल रही प्रक्रियाओं को सूचीबद्ध करते हैं:

ps -ef

फिर पहले कॉलम में आप अपना उपयोगकर्ता नाम पाते हैं; मैंने इसे तीन बार पाया:

  • एक एसएसएच कनेक्शन था
  • दूसरा एफ़टीपी कनेक्शन था
  • पिछले एक nohup प्रक्रिया थी

फिर दूसरे कॉलम में आप nohup प्रक्रिया का PID पा सकते हैं और आप केवल टाइप करते हैं:

kill PID 

(nohup प्रक्रिया के PID के साथ PID को बदलना)

और वह यह है!

मुझे आशा है कि यह उत्तर किसी के लिए भी उपयोगी होगा, मैं भी bash और SSH के लिए बहुत नया हूं, लेकिन 95% ज्ञान मुझे यहां मिला है :)


3
मुझे लगता है कि आपके यहाँ UID के बजाय PID का मतलब था?
विप्रिन्स

मैं @wprins से सहमत हूं। UID को मारना मेरे लिए काम नहीं आया, लेकिन PID को मार दिया।
रियान

मेरे मामले में मैं एक परीक्षण खोल स्क्रिप्ट (long_running_script.sh) nohup और & के साथ भागा और पता था कि इसे कैसे रोकना है। अंत में, मैंने एक ps -ef किया | grep long_running * और PID को फ़ॉउंड करें। फिर पीआईडी ​​को मार डाला
रेनिश जोसेफ

50

मुझे लगता है मैं नीचे की कमान के साथ पृष्ठभूमि में रूबी स्क्रिप्ट चला रहा हूँ

nohup ruby script.rb &

तब मैं कमांड नाम निर्दिष्ट करके पृष्ठभूमि की उपरोक्त प्रक्रिया को प्राप्त कर सकता हूं। मेरे मामले में कमान माणिक है।

ps -ef | grep ruby

उत्पादन

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

अब आप आसानी से किल कमांड का उपयोग करके प्रक्रिया को मार सकते हैं

kill 25938

1
संजय, तो बस मुझे यकीन है कि मैं कुछ भी याद नहीं कर रहा हूं, आपके उत्तर का कौन सा हिस्सा नए या अलग-अलग हैं जो वर्षों पहले दिए गए उत्तरों से अलग हैं? ps -efऔर killदोनों को अच्छी तरह से ऊपर कवर किया गया था, इसलिए नया हिस्सा क्या है?
डेविड सी। रंकिन

2
ps -ef आपको आउटपुट की लंबी सूची देगा और इस लंबी सूची से खोज करना मुश्किल होगा। तो मुझे लगता है कि ps -ef | grep रूबी पीएस की खोज करने से बेहतर है कि केवल पीएफ़ की खोज की जाए
संजय सालुंके

20

जॉब्स -एल आपको नोहूप प्रक्रियाओं की सूची के लिए पीआईडी ​​देना चाहिए। मार (-9) उन्हें धीरे से। ;)


11
यदि केवल वर्तमान शेल में नौकरी शुरू की गई थी। और kill -9जब तक आप यह नहीं जानते कि नियमित सिग्नल काम नहीं करते हैं।
ट्रिपलए

1
यह उपयोगी है, अगर आप कुछ डॉकटर छवि पर हैं जहाँ ps संस्थापित नहीं है :-)
एंड्रियास Profous

5

तुम कोशिश कर सकते हो

kill -9 `pgrep [command name]`

2
बहुत अच्छा! मैंने उपयोग किया pkill [command name]आप -oसबसे पुराने मिलान प्रक्रिया को मारने के लिए या -nइसके बजाय नवीनतम का उपयोग करने के लिए ध्वज का उपयोग कर सकते हैं ।
ज़ानोना

4

इसमें काम करता है Ubuntu

यह जानने के लिए टाइप करें PID

ps aux | grep java

जावा के संबंध में चल रही सभी प्रक्रिया को दिखाया जाएगा

मेरे मामले में है

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

अब इसे मार डालो kill -9 3315

ज़ोंबी प्रक्रिया आखिरकार बंद हो गई।


4

मान लीजिये आप nohup के साथ एक java प्रोग्राम को अंजाम दे रहे हैं, तो आप java प्रोसेस id प्राप्त कर सकते हैं

`ps aux | grep java`

उत्पादन

xxxxx     9643  0.0  0.0  14232   968 pts/2   

तब आप टाइप करके प्रक्रिया को मार सकते हैं

sudo kill 9643

या यह कहते हैं कि आपको सभी जावा प्रक्रियाओं को मारने की जरूरत है, तो बस उपयोग करें

sudo killall java

यह कमांड सभी जावा प्रोसेसर को मारता है। आप इस प्रक्रिया के साथ उपयोग कर सकते हैं। केवल कमांड के अंत में प्रक्रिया का नाम दें

sudo killall {processName}

2

जब आप nohup में नौकरी बनाते हैं तो यह आपको प्रक्रिया आईडी बताएगा!

nohup sh test.sh &

आउटपुट आपको प्रक्रिया आईडी की तरह दिखाएगा

25013

आप इसे तब मार सकते हैं:

kill 25013

1

मैंने निम्नलिखित कमांड के साथ django सर्वर शुरू किया।

nohup manage.py runserver <localhost:port>

यह CentOS पर काम करता है:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

यह process not foundnohup के साथ भ्रम को हल करने के लिए जाना जाता है ।
कोडस्पेक्ट

0

आज मैं उसी समस्या से मिला। और जब से यह एक लंबे समय से पहले था, मैं पूरी तरह से भूल गया कि मैंने किस कमांड का इस्तेमाल किया और कब किया। मैंने तीन तरीके आज़माए:

  1. में दिखाए गए STIME का उपयोग करना ps -efकमांड । यह उस समय को दिखाता है जब आप अपनी प्रक्रिया शुरू करते हैं, और यह बहुत संभावना है कि आप अपने पास ssh (आप पर निर्भर करता है) से ठीक पहले आपको आदेश दें। दुर्भाग्य से मुझे नहीं लगता कि नवीनतम कमांड है जो मैं nohup का उपयोग करके चलाता हूं, इसलिए यह मेरे लिए काम नहीं करता है।
  2. दूसरा PPID है, जिसे ps -efकमांड में भी दिखाया गया है । इसका अर्थ है पेरेंट प्रोसेस आईडी, प्रक्रिया की आईडी जो प्रक्रिया बनाती है। Ppid प्रक्रिया के लिए ubuntu में 1 है जिसे चलाने के लिए nohup का उपयोग किया जाता है। फिर आप ps --ppid "1"सूची प्राप्त करने के लिए उपयोग कर सकते हैं , और प्रक्रिया के पीआईडी ​​को खोजने के लिए टाइम (आपकी प्रक्रिया का कुल सीपीयू समय) या सीएमडी की जांच कर सकते हैं।
  3. उपयोग करें lsof -i:portयदि प्रक्रिया कुछ बंदरगाहों पर कब्जा कर लेती है, और आपको कमांड मिलेगी। फिर ऊपर दिए गए उत्तर की तरह, उपयोग करें ps -ef | grep commandऔर आपको पीआईडी ​​मिल जाएगी।

एक बार जब आप प्रक्रिया का पीआईडी ​​पा लेते हैं, तो प्रक्रिया kill pidको टर्मिनल करने के लिए उपयोग कर सकते हैं ।

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