कमांड लाइन से नोड.जेएस प्रोग्राम को रोकें


304

मेरे पास एक साधारण टीसीपी सर्वर है जो एक पोर्ट पर सुनता है।

var net = require("net");

var server = net.createServer(function(socket) {
    socket.end("Hello!\n");
});

server.listen(7777);

मैं इसके साथ शुरू करता हूं node server.jsऔर फिर इसे मैक पर Ctrl + Z के साथ बंद करता हूं । जब मैं इसे फिर से चलाने की कोशिश करता हूं तो मुझे node server.jsयह त्रुटि संदेश मिलता है:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
          ^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)

क्या मैं कार्यक्रम को गलत तरीके से बंद कर रहा हूं? मेरे द्वारा इसे होने से कैसे रोका जा सकता है?


2
संभवतः यह जोड़ने लायक है कि Ctrl-Z एक कमांड को * NIX पर निलंबित करता है, और इसे बंद नहीं करता है। यदि आप fgCtrl-Z के बाद टाइप करते हैं , तो आप वापस वहीं आ जाएंगे जहां से आपने छोड़ा था। तो आपका पहले का नोड अभी भी चल रहा है। यदि आप अन्य आदेशों के लिए भी ऐसा कर रहे हैं तो देखें!
रफिन

1
@ क्रूफ़िन यह एक उत्तर होना चाहिए। यदि आपने Ctrl+Zकार्रवाई की है, fgतो प्रक्रिया को पुनर्जीवित करने के लिए एक उचित कार्यप्रणाली हो सकती है, और फिर Ctrl+Cइसे उचित रूप से मारने के लिए।
पैराग्राफ

जवाबों:


393

कार्यक्रम को समाप्त करने के लिए, आपको Ctrl+ का उपयोग करना चाहिए C। यदि आप ऐसा करते हैं, तो यह भेजता है SIGINT, जो प्रोग्राम को शान्तिपूर्वक समाप्त करने की अनुमति देता है, किसी भी पोर्ट से unbinding जो यह सुन रहा है।

इसे भी देखें: https://superuser.com/a/262948/48624


21
Ctrl + Cमेरे लिए काम नहीं करता है। केवल ^Cकंसोल में टाइप किया जाता है, और प्रोग्राम बाहर नहीं निकलता है।
हाथी

1
@ इलीट, आप टर्मिनल के रूप में क्या उपयोग कर रहे हैं? यह मेरे लिए बहुत अच्छा काम करता है।
ब्रैड

2
@ एलीस्ट, आपने शायद अपनी कुंजियों या किसी चीज़ को दोबारा बनाया है। Ctrl+Cठीक काम करता है। किसी भी मामले में, यह आपकी वास्तविक समस्या से अलग मुद्दा है। SuperUser.com पर आपको "Ctrl + C काम नहीं करता है" सवाल पोस्ट करना चाहिए।
ब्रैड

1
@ jt0dd आप हमेशा कर सकते हैं kill -9, लेकिन मैं नहीं कर सकता। क्या आप वास्तव में सुनिश्चित हैं कि आपका एप्लिकेशन अभी भी पोर्ट खुला रखने वाला है? मुझे वह समस्या कभी नहीं हुई। जैसे ही मेरा आवेदन समाप्त होता है, कनेक्शन हमेशा तुरंत समाप्त हो जाते हैं। मैं यह निर्धारित करने के लिए नेटस्टैट का उपयोग करूंगा कि आपका ऐप या कुछ और उस पोर्ट पर टिका हुआ है या नहीं।
ब्रैड

1
मुझे इस समस्या का सामना करना पड़ा जब मैं अन्य भाषा पर कीबोर्ड प्रकार का उपयोग कर रहा था। सुनिश्चित करें कि आपकी मैक इनपुट भाषा अंग्रेजी है
Fa.Shapuri

325

Ctrl+ Zइसे निलंबित करता है, जिसका अर्थ है कि यह अभी भी चल रहा है।

Ctrl+ Cवास्तव में इसे मार देंगे।

आप इसे इस तरह से मैन्युअल रूप से मार सकते हैं:

ps aux | grep node

प्रक्रिया आईडी ढूंढें (बाएं से दूसरा):

kill -9 PROCESS_ID

यह भी काम कर सकता है

killall node

ctrl + c काम करेगा लेकिन इनमें से कोई भी कमांड मेरे लिए काम नहीं करेगा। मुझे नहीं पता क्यों? और मैं कमांड लाइन समाधान की तलाश कर रहा हूं
क्रोधित कीवी

7
किलॉल नोड के साथ सावधान रहें, आप प्रक्रिया को मार सकते हैं यदि आप "नोड" से मेल नहीं खाना चाहते हैं
शमूएल बोल्डुच

1
आप killall nodeअपने जवाब में आगे बढ़ना चाहते हैं क्योंकि यह वास्तव में सबसे आसान और विश्वसनीय विकल्प है (जब तक आप सभी उदाहरणों को मारने के साथ ठीक नहीं हो जाते हैं)
Boern

4
'किंडल' को आंतरिक या बाहरी कमांड, ऑपरेशनल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता नहीं दी जाती है। क्या मैं कुछ भूल रहा हूँ?
अय्याश

यहाँ भी ... कोई जवाब नहीं? यह कहता है कि 'किल' को मान्यता नहीं है। अन्य कमांड में से कोई भी काम नहीं करता है। क्या मुझे अपने कंप्यूटर को पुनः आरंभ करने की आवश्यकता है या क्या?
मेथडियन

37

या वैकल्पिक रूप से आप इन सभी को एक पंक्ति में कर सकते हैं:

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

आप नोड को किसी अन्य प्रक्रिया नाम के साथ '\ snode \ s' के अंदर बदल सकते हैं।


2
वैकल्पिक रूप से, आप हमेशा कोशिश कर सकते हैं: ps -ef | grep "नोड" | awk '{प्रिंट $ 2}' | xargs मार -9
frymaster

काम करने लगता है, लेकिन ठीक से मुझे एक संकेत के लिए वापस नहीं करता है। विचार?
डेविल्स एडवोकेट

25

प्रक्रिया फिर से शुरू और मारें:

Ctrl+ Zइसे निलंबित कर देता है, जिसका अर्थ है कि यह अभी भी एक निलंबित पृष्ठभूमि प्रक्रिया के रूप में चल रहा है।

अब आप एक टर्मिनल प्रॉम्प्ट पर होने की संभावना है ...

  1. fgअग्रभूमि में प्रक्रिया को फिर से शुरू करने के लिए कमांड दें ।

  2. प्रकार Ctrl+ Cइसे ठीक से मारने के लिए।


वैकल्पिक रूप से, आप इसे इस तरह से मैन्युअल रूप से मार सकते हैं:

( नोट: निम्नलिखित आदेशों को रूट की आवश्यकता हो सकती है, इसलिए sudo ...आपका मित्र है)

pkill -9 node

या, यदि आपके पास pkill नहीं है, तो यह काम कर सकता है:

killall node

या शायद यह:

kill $(ps -e | grep node | awk '{print $1}')

कभी-कभी यह प्रक्रिया अपने स्वयं के grep को सूचीबद्ध करेगी, जिस स्थिति में आपको आवश्यकता होगी:

kill $(ps -e | grep dmn | awk '{print $2}')


प्रश्न पर टिप्पणी से h / t @ruffin। मेरे पास एक ही मुद्दा था और उनकी टिप्पणी से मुझे खुद को हल करने में मदद मिली।


22

आप .exit नोड js REPL को छोड़ने के लिए टाइप कर सकते हैं


2
यह मानता है कि आप आरईपीएल में हैं । क्या होगा यदि मेरे पास एक नोड स्क्रिप्ट चल रही है?
इगोरगानापोलस्की

18

यदि आप अंतःक्रियात्मक रूप से (REPL) Node.js चला रहे हैं:

Ctrl+ Cआपको वापस ले जाएगा> फिर टाइप करें:

process.exit()

या सिर्फ Ctrl+ का उपयोग करें D



13

linux try पर: pkill node

खिड़कियों पर:

Taskkill /IM node.exe /F

या

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])

5

हालांकि यह एक देर से जवाब है, मुझे यह NodeJS डॉक्स से मिला :

'एक्जिट' ईवेंट तब उत्सर्जित होता है जब REPL .exitइनपुट के रूप में कमांड प्राप्त करके या तो बाहर निकल जाता है, उपयोगकर्ता <ctrl>-CSIGINT को सिग्नल के लिए दो बार दबाता है, या <ctrl>-Dइनपुट स्ट्रीम पर सिग्नल 'एंड' दबाकर । श्रोता कॉलबैक को बिना किसी तर्क के लागू किया जाता है।

तो संक्षेप में आप द्वारा बाहर निकलने के लिए कर सकते हैं:

  1. .exitनोडज आरईपीएल में टाइपिंग ।
  2. <ctrl>-Cदो बार दबाना ।
  3. दबाने वाला <ctrl>-D
  4. process.exit(0)REPL से एक प्राकृतिक निकास का अर्थ है। यदि आप किसी अन्य स्थिति को वापस करना चाहते हैं तो आप एक गैर शून्य संख्या वापस कर सकते हैं।
  5. process.kill(process.pid) अपने कोड के भीतर या REPL से नोड्ज एपीआई का उपयोग कर मारने का तरीका है।

5

मैं इस जवाब को जोड़ रहा हूं क्योंकि उत्पादन परिनियोजन के साथ कई परियोजनाओं के लिए, हमारे पास स्क्रिप्ट हैं जो इन प्रक्रियाओं को रोकती हैं इसलिए हमें नहीं करना है।

अपनी नोड सर्वर प्रक्रियाओं को प्रबंधित करने का एक साफ तरीका foreverपैकेज (से NPM) का उपयोग कर रहा है ।

उदाहरण:

हमेशा के लिए स्थापित करें

npm install forever -g

नोड सर्वर चलाएं

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

परिणाम:

info: Forever processing file: server.js

शटडाउन नोड सर्वर

forever stop server.js

परिणाम

info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247

यह आपके सर्वर एप्लिकेशन को सफाई से बंद कर देगा।


2

अगर आप अपने सर्वर को npm stopकुछ इस तरह से रोकना चाहते हैं । आप कोड लिख सकते हैं जो आपकी सर्वर प्रक्रिया को मारता है:

require('child_process').exec(`kill -9 ${pid}`)

इस लिंक को विस्तार से देखें: https://gist.github.com/dominhhai/aa7f3314ad27e2c50xd5


2

मैं एक समस्या में भाग गया, जहाँ मेरे पास कई नोड सर्वर चल रहे हैं, और मैं उनमें से सिर्फ एक को मारना चाहता हूं और इसे एक स्क्रिप्ट से फिर से तैयार ।

नोट: यह उदाहरण मैक पर बैश शेल में है।

ऐसा करने के लिए मैं अपने nodeकॉल को यथासंभव विशिष्ट बनाना सुनिश्चित करता हूं । उदाहरण के लिए node server.js, ऐप निर्देशिका से कॉल करने के बजाय , मैं कॉल करता हूंnode app_name_1/app/server.js

तब मैं इसका उपयोग करके मार सकता हूं:

kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')

यह केवल app_name_1 / app / server.js पर चलने वाली नोड प्रक्रिया को मार देगा।

अगर आप दौड़े node app_name_2/app/server.js यह नोड प्रक्रिया रहेगी।

यदि आप तय करते हैं कि आप उन सभी को मारना चाहते हैं, जिनका आप उपयोग कर सकते हैं, killall nodeजैसा कि दूसरों ने उल्लेख किया है।


2

उत्तर देर से लेकिन विंडोज़ पर, CTRL + ALT + DEL के साथ कार्य प्रबंधक को खोलना फिर Node.js प्रक्रियाओं को मारना इस त्रुटि को हल करेगा।


2

आप स्थानीय पर्यवेक्षक की हत्या में विशिष्ट होने के लिए निम्नलिखित आदेश पर काम कर सकते हैं (यहाँ: 8000)

http: // localhost: 8000 / किल पीआईडी ​​(प्रोसेसआईड):

$:lsof -i tcp:8000

यह आपको टीसीपी के निम्नलिखित समूह देगा:

COMMID PID USER FD TYPE DEVICE SIZE / OFF NODE NAME

नोड 21521 ubuntu 12u IPv6 345668 0t0 टीसीपी *: 8000 (लिस्टेन)

$:kill -9 21521

यह टीसीपी *: 8000 के अनुरूप प्रोसेसआईड को मार देगा



2

आप फ्यूज़र का उपयोग कर सकते हैं कि आप क्या करना चाहते हैं।

पोर्ट पर चल रहे कार्यों की प्रक्रिया आईडी प्राप्त करने के लिए:

fuser <<target_port>>/tcp

मान लीजिए कि पोर्ट 8888 है, कमांड बन जाता है:

fuser 8888/tcp

और एक प्रक्रिया को मारने के लिए जो एक पोर्ट पर चल रही है, बस ऐड-स्विच स्विच करें।

fuser <<target_port>>/tcp -k

उदाहरण (बंदरगाह 8888 है):

fuser 8888/tcp -k

बस! यह पोर्ट पर सुनने की प्रक्रिया को बंद कर देगा। मैं आमतौर पर अपने सर्वर एप्लिकेशन को चलाने से पहले ऐसा करता हूं।


1

मेरा उपयोग मामला: MacOS पर , स्क्रिप्ट से अलग-अलग पोर्ट पर कई नोड सर्वरों को चलाएँ / पुन: चलाएँ

चलाएं :"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

स्टॉप 1 :"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

स्टॉप 2, स्टॉप 3 ...

पुनर्मिलन :"stop1 & stop2 & ... & stopN ; run

पोर्ट द्वारा एक प्रक्रिया खोजने के बारे में अधिक जानकारी के लिए: मैक ओएस एक्स पर दिए गए टीसीपी पोर्ट पर कौन सुन रहा है?


0

खिड़कियों के लिए पहले अपने पोर्ट नंबर के साथ पीआईडी ​​खोजें

netstat -ano | findStr "portNumber"

उसके बाद, कार्य को मारें, सुनिश्चित करें कि आप अपने "सी" ड्राइव की जड़ में हैं यहां छवि विवरण दर्ज करें और कमांड होगाtaskkill /F /PID your pid


0

यदि आप वी.एस. कोड और टर्मिनल सिलेक्ट नोड का उपयोग दाईं ओर ड्रॉपडाउन से कर रहे हैं तो पहले Ctrl + C. करें फिर यह काम करेगा

यहां छवि विवरण दर्ज करें

संकेत मिलने पर y दबाएँ।

यहां छवि विवरण दर्ज करें

धन्यवाद

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