কমান্ড লাইন থেকে নোড.জেএস প্রোগ্রাম বন্ধ করুন


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 এর একটি কমান্ড স্থগিত করে এবং এটি বন্ধ করে না। আপনি যদি fgসিটিআরএল-জেডের পরে টাইপ করেন তবে আপনি যেখানে ফিরে এসেছেন সেখানে ফিরে আসবেন। সুতরাং আপনার আগের নোড এখনও চলছে। আপনি যদি অন্য কমান্ডের জন্যও এটি করে থাকেন তবে সন্ধান করুন!
ruffin

1
@ আরফিন এটি উত্তর হতে হবে। আপনি যদি Ctrl+Zক্রিয়াটি করেন তবে একটি সঠিক পদ্ধতিটি fgপ্রক্রিয়াটি পুনরুদ্ধার করা এবং তারপরে Ctrl+Cএটি যথাযথভাবে হত্যা করা হতে পারে।
মেটাগ্রাফার

উত্তর:


393

প্রোগ্রাম শেষ করতে, আপনি ব্যবহার করা উচিত Ctrl+ + C। যদি আপনি এটি করেন, এটি প্রেরণ করে SIGINT, যা প্রোগ্রামটি মনোযোগ দিয়ে শেষ করতে দেয় , এটি যে কোনও পোর্ট শুনতে পাচ্ছে তা বন্ধ করে দেয়।

আরও দেখুন: https://superuser.com/a/262948/48624


21
Ctrl + Cআমার জন্য কাজ করে না। কেবল ^Cকনসোলে টাইপ হয় এবং প্রোগ্রামটি বের হয় না।
এলিস্ট

1
@ এলিস্ট, আপনি টার্মিনাল হিসাবে কী ব্যবহার করছেন? এটি আমার জন্য খুব ভালো কাজ করছে।
ব্র্যাড

2
@ এলিস্ট, আপনি সম্ভবত আপনার কী বা কিছু পুনরায় তৈরি করেছেন। Ctrl+Cঠিকভাবে কাজ করে. যাই হোক না কেন, এটি আপনার আসল সমস্যা থেকে পৃথক সমস্যা। আপনার সুপার ইউজার ডট কম এ "Ctrl + C কাজ করে না" প্রশ্ন পোস্ট করা উচিত।
ব্র্যাড

1
@ jt0dd আপনি সর্বদা করতে পারতেন kill -9, কিন্তু আমি তা করতাম না। আপনি কি আসলেই নিশ্চিত যে আপনার অ্যাপ্লিকেশনটি এখনও পোর্ট বন্দর খোলা রয়েছে? আমি কখনও এই সমস্যা ছিল না। আমার আবেদন শেষ হওয়ার সাথে সাথে সংযোগগুলি সর্বদা অবিলম্বে বন্ধ হয়ে যায়। আপনার অ্যাপ্লিকেশন বা অন্য কোনও কিছু সেই বন্দরে স্থিতিশীল রয়েছে কিনা তা নির্ধারণ করতে আমি নেটস্যাট ব্যবহার করব।
ব্র্যাড

1
আমি যখন অন্য ভাষাতে কীবোর্ড টাইপ ব্যবহার করছিলাম তখন আমি এই সমস্যার মুখোমুখি হয়েছি। আপনার ম্যাক ইনপুট ভাষাটি ইংরাজী কিনা নিশ্চিত হন
ফা.শাপুরি

325

Ctrl+ + Zএটা স্থগিত, যার মানে এটা এখনও চলমান করা যেতে পারে।

Ctrl+ + Cআসলে এটি হত্যা করবে।

আপনি এটি নিজে এইভাবে হত্যা করতে পারেন:

ps aux | grep node

প্রক্রিয়া আইডি (বাম থেকে দ্বিতীয়) সন্ধান করুন:

kill -9 PROCESS_ID

এটিও কাজ করতে পারে

killall node

ctrl + c কাজ করবে তবে এই আদেশের কোনওটিই আমার পক্ষে কাজ করবে না। কেন জানি না? এবং আমি কমান্ড লাইন সমাধান খুঁজছি
রাগান্বিত কিউই

7
কিলাল নোড সম্পর্কে সতর্কতা অবলম্বন করুন, আপনি "নোড" এর সাথে মেলে যদি আপনি হত্যা করতে চান না এমন প্রক্রিয়াটি শেষ করতে পারেন
স্যামুয়েল বোলডুক

1
আপনি killall nodeআপনার উত্তরের দিকে যেতে চাইতে পারেন যেহেতু এটিই সবচেয়ে সহজ এবং সবচেয়ে নির্ভরযোগ্য বিকল্প (যতক্ষণ না আপনি সমস্ত ঘটনা হত্যার পক্ষে ঠিক আছেন)
বোর্ন

4
'কিল্ল' কোনও অভ্যন্তরীণ বা বাহ্যিক কমান্ড, অপারেবল প্রোগ্রাম বা ব্যাচ ফাইল হিসাবে স্বীকৃত নয়। আমি কিছু অনুপস্থিত করছি?
আইয়্যাশ

এখানেও ... উত্তর নেই? এটি বলে 'কিল্ল' স্বীকৃত নয়। অন্যান্য কমান্ডগুলির কোনওটিই কাজ করে না। আমার কম্পিউটারটি পুনরায় চালু করতে হবে বা কী?
মেথোডিশিয়ান

37

অথবা বিকল্পভাবে আপনি এই সমস্ত কিছু এক লাইনে করতে পারেন:

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

আপনি অন্য কোনও প্রক্রিয়া নামের সাথে '\ স্নোড \ s' এর ভিতরে নোড প্রতিস্থাপন করতে পারেন।


2
পর্যায়ক্রমে, আপনি সর্বদা চেষ্টা করতে পারেন: PS -ef | গ্রেপ "নোড" | awk '{মুদ্রণ $ 2}' | xargs কিল -9
ফ্রিমাস্টার

কাজ দেখে মনে হচ্ছে তবে সঠিকভাবে আমাকে কোনও প্রম্পটে ফিরিয়ে দেয় না। থটস?
ডেভিলের অ্যাডভোকেট

25

প্রক্রিয়াটি আবার শুরু করুন এবং হত্যা করুন:

Ctrl+ + Zএটা স্থগিত, যার মানে এটা এখনও একটি স্থগিত পটভূমি প্রক্রিয়া হিসেবে চলছে।

আপনি সম্ভবত এখন একটি টার্মিনাল প্রম্পটে ...

  1. fgঅগ্রভাগে প্রক্রিয়াটি পুনরায় শুরু করতে কমান্ড দিন ।

  2. এটি Ctrl+ Cকে সঠিকভাবে হত্যা করতে টাইপ করুন ।


বিকল্পভাবে, আপনি এটি ম্যানুয়ালি এটি হত্যা করতে পারেন:

( দ্রষ্টব্য: নিম্নলিখিত কমান্ডগুলির মূলের প্রয়োজন হতে পারে, sudo ...আপনার বন্ধুও তাই )

pkill -9 node

বা, যদি আপনার পিল না থাকে তবে এটি কাজ করতে পারে:

killall node

বা সম্ভবত এটি:

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

কখনও কখনও প্রক্রিয়াটি তার নিজস্ব গ্রেপ তালিকাভুক্ত করে, এক্ষেত্রে আপনার প্রয়োজন হবে:

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


এইচ / টি @ আরফিন প্রশ্নের নিজেরাই মন্তব্য থেকে। আমার একই সমস্যা ছিল এবং তার মন্তব্য আমাকে এটি সমাধান করতে সহায়তা করেছে।


22

আপনি .exit নোড জেএসপিএল প্রস্থান করতে টাইপ করতে পারেন


2
এটি ধরে নিয়েছে যে আপনি শুরু করার জন্য REPL এ আছেন । আমার যদি নোড স্ক্রিপ্ট চালু থাকে?
ইগোরগানাপলস্কি

18

আপনি যদি নোড.জেএস ইন্টারেক্টিভভাবে চালিত হন (আরপিএল):

Ctrl+ Cআপনাকে পুনরায়> প্রম্পটে নিয়ে যাবে তারপরে টাইপ করুন:

process.exit()

বা শুধু ব্যবহার Ctrl+ + D



13

লিনাক্স চেষ্টা: pkill node

উইন্ডোতে:

Taskkill /IM node.exe /F

অথবা

from subprocess import call

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

5

যদিও এটি একটি দেরী উত্তর, আমি নোডজেএস ডক্স থেকে এটি পেয়েছি :

' .exitইনপুট ' ইভেন্টটি নির্গত হয় যখন আরআরপিএলটি ইনপুট হিসাবে কমান্ডটি গ্রহণ করে , ব্যবহারকারী <ctrl>-Cদু'বার সিগন্যাল সিগিনেটে চাপলে অথবা <ctrl>-Dইনপুট প্রবাহে 'শেষ' সিগন্যাল টিপে চাপ দেয়। শ্রোতাদের কলব্যাক কোনও যুক্তি ছাড়াই চাওয়া হয়েছে।

সুতরাং সংক্ষিপ্তসার হিসাবে আপনি দ্বারা প্রস্থান করতে পারেন:

  1. .exitনোডেজগুলি টাইপ করা হচ্ছে REPL।
  2. <ctrl>-Cদুবার টিপছে ।
  3. টিপছে <ctrl>-D
  4. process.exit(0)REPL থেকে প্রাকৃতিক প্রস্থান মানে। আপনি যদি অন্য কোনও স্থিতি ফিরে আসতে চান তবে আপনি একটি শূন্য নম্বর ছাড়াই ফিরে আসতে পারেন।
  5. process.kill(process.pid) আপনার কোডের মধ্যে থেকে বা আরপিএল থেকে নোডেজ এপিআই ব্যবহার করে হত্যা করার উপায়।

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/aa7f3314ad27e2c50fd5


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}')

এটি কেবলমাত্র অ্যাপ_নাম_1 / অ্যাপ / সার্ভার.জেজে চলমান নোড প্রক্রিয়াটিকে হত্যা করবে।

আপনি যদি node app_name_2/app/server.jsএই নোডটি চালিয়ে যান তবে চলতে থাকবে।

আপনি যদি সিদ্ধান্ত নেন আপনি killall nodeঅন্যদের হত্যা করতে চান তবে অন্যরা যেমন উল্লেখ করেছে তেমন ব্যবহার করতে পারবেন ।


2

দেরীতে উত্তর তবে উইন্ডোজে, CTRL + ALT + DEL দিয়ে টাস্ক ম্যানেজারটি খোলার পরে নোড.জেএসএস প্রক্রিয়াগুলিকে হত্যা করা এই ত্রুটিটি সমাধান করবে।


2

আপনি স্থানীয় সার্ভার কিলের জন্য নির্দিষ্ট কমান্ডের সাহায্যে কাজ করতে পারেন (এখানে: 8000)

http: // লোকালহোস্ট: 8000 / কিল পিআইডি (প্রসেসআইডি):

$:lsof -i tcp:8000

এটি আপনাকে টিসিপিগুলির নিম্নলিখিত গ্রুপগুলি দেবে:

কম্যান্ড পিআইডি ব্যবহারকারী এফডি টাইপ ডিভাইস সাইজ / কোনও নাম বাদ নেই

নোড 21521 উবুন্টু 12u আইপিভি 6 345668 0 টি 0 টিসিপি *: 8000 (তালিকাভুক্ত)

$:kill -9 21521

এটি টিসিপি *: 8000 এর সাথে সম্পর্কিত প্রক্রিয়াটিকে হত্যা করবে



2

আপনি যা করতে চান তা পেতে আপনি ফুসার ব্যবহার করতে পারেন ।

কোনও বন্দরে চলমান কাজগুলির প্রসেস আইডির জন্য আপনি করতে পারেন:

fuser <<target_port>>/tcp

ধরা যাক বন্দরের 8888, কমান্ডটি হ'ল:

fuser 8888/tcp

এবং হত্যা একটি প্রক্রিয়া যা পোর্ট চলছে, সহজভাবে -k সুইচ যোগ করুন।

fuser <<target_port>>/tcp -k

উদাহরণ (পোর্টটি 8888):

fuser 8888/tcp -k

এটাই! এটি বন্দরে শোনার প্রক্রিয়াটি বন্ধ করে দেবে। আমি সাধারণত আমার সার্ভার অ্যাপ্লিকেশন চালানোর আগে এটি করি।


1

আমার ব্যবহারের কেস: ম্যাকোএসে , স্ক্রিপ্ট থেকে বিভিন্ন পোর্টে একাধিক নোড সার্ভারগুলি চালিত / পুনরায় চালন করুন

চালান :"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 টিপুন।

এখানে চিত্র বর্ণনা লিখুন

ধন্যবাদ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.