หยุดโปรแกรม node.js จากบรรทัดคำสั่ง


304

ฉันมีเซิร์ฟเวอร์ TCP ทั่วไปที่ฟังพอร์ต

var net = require("net");

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

server.listen(7777);

ฉันเริ่มด้วยnode server.jsแล้วปิดด้วย Ctrl + Z บน Mac เมื่อฉันพยายามเรียกใช้อีกครั้งโดย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หลังจาก Ctrl-Z คุณจะกลับมาที่ที่ค้างไว้ ดังนั้นโหนดก่อนหน้าของคุณยังคงทำงานอยู่ ระวังถ้าคุณกำลังทำสิ่งนี้สำหรับคำสั่งอื่นด้วย!
ruffin

1
@ รัฟฟินนี่ควรเป็นคำตอบ หากคุณได้ดำเนินCtrl+Zการแล้ววิธีการที่เหมาะสมอาจfgช่วยฟื้นฟูกระบวนการและCtrl+Cฆ่าให้เหมาะสม
Metagrapher

คำตอบ:


393

การสิ้นสุดการโปรแกรมที่คุณควรจะใช้+Ctrl Cหากคุณทำเช่นนั้นโปรแกรมจะส่งSIGINTซึ่งทำให้โปรแกรมสามารถจบการทำงานได้อย่างสง่างามโดยไม่ผูกกับพอร์ตใด ๆ ที่กำลังฟังอยู่

ดูเพิ่มเติมที่: https://superuser.com/a/262948/48624


21
Ctrl + Cไม่ได้ผลสำหรับฉัน เพียง แต่^Cได้รับการพิมพ์ลงในคอนโซลและโปรแกรมไม่ออก
Eleeist

1
@ ผู้ชำนาญสิ่งที่คุณใช้เป็นขั้ว? มันใช้งานได้ดีสำหรับฉัน
แบรด

2
@ ผู้ชำนาญคุณอาจจะทำการแมปกุญแจหรือบางอย่างใหม่ Ctrl+Cทำงานได้ดี ไม่ว่าในกรณีใดนั่นเป็นปัญหาแยกต่างหากจากปัญหาที่แท้จริงของคุณ คุณควรโพสต์คำถาม "Ctrl + C ไม่ทำงาน" ที่ SuperUser.com
แบรด

1
@ jt0dd คุณทำได้เสมอkill -9แต่ฉันจะไม่ทำ คุณแน่ใจหรือไม่ว่าแอพพลิเคชันของคุณยังคงเป็นพอร์ตที่เปิดอยู่ ฉันไม่เคยมีปัญหานั้น ทันทีที่ใบสมัครของฉันสิ้นสุดลงการเชื่อมต่อจะยุติลงทันที ฉันจะใช้ netstat เพื่อตรวจสอบว่าแอปของคุณหรืออะไรก็ตามที่อืดอาดอยู่บนพอร์ตนั้น
แบรด

1
ฉันประสบกับปัญหานี้เมื่อฉันใช้แป้นพิมพ์ในภาษาอื่น ต้องแน่ใจว่าภาษาอินพุต Mac ของคุณเป็นภาษาอังกฤษ
Fa.Shapouri

325

Ctrl+ Zระงับมันซึ่งหมายความว่ายังคงสามารถทำงานได้

Ctrl+ Cจะฆ่ามันจริงๆ

คุณสามารถฆ่ามันด้วยตนเองเช่นนี้:

ps aux | grep node

ค้นหา ID กระบวนการ (ที่สองจากซ้าย):

kill -9 PROCESS_ID

สิ่งนี้อาจใช้งานได้

killall node

ctrl + c จะทำงานได้ แต่ไม่มีคำสั่งใดที่จะใช้ได้สำหรับฉัน ฉันไม่รู้ว่าทำไม และฉันกำลังมองหาวิธีแก้ปัญหาบรรทัดคำสั่ง
กีวีโกรธ

7
ระวังโหนด killall คุณอาจจะฆ่ากระบวนการที่คุณไม่ต้องการฆ่าถ้าตรงกับ "node"
Samuel Bolduc

1
คุณอาจต้องการที่จะเลื่อนขึ้นkillall nodeในคำตอบของคุณตั้งแต่ที่เป็นจริงตัวเลือกที่ง่ายและน่าเชื่อถือมากที่สุด (ตราบใดที่คุณ ok อยู่กับการฆ่าทุกกรณี)
Boern

4
'killall' ไม่ได้รับการยอมรับว่าเป็นคำสั่งภายในหรือภายนอกโปรแกรมที่ทำงานได้หรือไฟล์แบตช์ ฉันพลาดอะไรไปรึเปล่า?
Ayyash

กันที่นี่ ... ไม่มีคำตอบ? มันบอกว่า 'killall' ไม่เป็นที่รู้จัก ไม่มีคำสั่งอื่นใดทำงานเช่นกัน ฉันจำเป็นต้องรีสตาร์ทคอมพิวเตอร์หรือไม่
เมธอดิสต์

37

หรืออีกวิธีหนึ่งคุณสามารถทำสิ่งเหล่านี้ได้ในหนึ่งบรรทัด:

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

คุณสามารถแทนที่โหนดภายใน '\ snode \ s' ด้วยชื่อกระบวนการอื่น ๆ


2
คุณสามารถลอง: ps -ef | grep "node" | awk '{พิมพ์ $ 2}' | xargs kill -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 เพื่อออกจาก node js REPL


2
ซึ่งถือว่าคุณอยู่ในREPLเพื่อเริ่มต้นด้วย จะเกิดอะไรขึ้นถ้าฉันมีสคริปต์ Node ที่ทำงานอยู่
IgorGanapolsky

18

หากคุณใช้ Node.js แบบโต้ตอบ (REPL):

Ctrl+ Cจะนำคุณกลับไปที่> พรอมต์จากนั้นพิมพ์:

process.exit()

หรือเพียงแค่ใช้+CtrlD


17

$ sudo killall nodeในเทอร์มินัลอื่นทำงานบนmacในขณะที่killall nodeไม่ทำงาน:

$ killall node
No matching processes belonging to you were found


5

แม้ว่านี่จะเป็นคำตอบที่ล่าช้า แต่ฉันพบสิ่งนี้จากNodeJS เอกสาร :

เหตุการณ์ 'exit' ถูกปล่อยออกมาเมื่อ REPL ถูกออกโดยรับคำ.exitสั่งเป็นอินพุตผู้ใช้กด<ctrl>-Cสองครั้งเพื่อส่งสัญญาณ SIGINT หรือโดยกด<ctrl>-Dเพื่อส่งสัญญาณ 'สิ้นสุด' บนสตรีมอินพุต การเรียกกลับฟังถูกเรียกโดยไม่มีข้อโต้แย้งใด ๆ

ดังนั้นเพื่อสรุปคุณสามารถออกโดย:

  1. การพิมพ์ .exitใน nodejs REPL
  2. การกด <ctrl>-Cสองครั้ง
  3. <ctrl>-Dการกด
  4. process.exit(0)หมายถึงทางออกธรรมชาติจาก REPL หากคุณต้องการส่งคืนสถานะอื่นใดคุณสามารถส่งคืนหมายเลขที่ไม่ใช่ศูนย์ได้
  5. process.kill(process.pid) เป็นวิธีฆ่าโดยใช้ nodejs api จากภายในรหัสของคุณหรือจาก 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

นี่จะเป็นการปิดแอปพลิเคชันเซิร์ฟเวอร์ของคุณอย่างหมดจด


3

หากคุณต้องการหยุดเซิร์ฟเวอร์ของคุณด้วยnpm stopหรืออะไรทำนองนี้ คุณสามารถเขียนรหัสที่ฆ่ากระบวนการเซิร์ฟเวอร์ของคุณเป็น:

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

ตรวจสอบลิงค์นี้เพื่อรับรายละเอียด: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5


2

ฉันพบปัญหาที่ฉันมี หลายโหนดเซิร์ฟเวอร์ที่ใช้งานอยู่และฉันต้องการที่จะฆ่าหนึ่งในนั้นและปรับใช้ใหม่จากสคริปต์

หมายเหตุ: ตัวอย่างนี้อยู่ใน bash shell บน Mac

เมื่อต้องการทำเช่นนั้นฉันต้องทำให้แน่ใจ 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

คำตอบที่ล่าช้า แต่อยู่บน windows การเปิดตัวจัดการงานด้วย CTRL + ALT + DEL จากนั้นการฆ่ากระบวนการ Node.js จะแก้ไขข้อผิดพลาดนี้


2

คุณสามารถทำงานคำสั่งต่อไปนี้จะเฉพาะในการฆ่า localserver (ที่นี่: 8000)

http: // localhost: 8000 / kill PID (processId):

$:lsof -i tcp:8000

มันจะให้กลุ่ม TCPs ต่อไปนี้แก่คุณ:

คำสั่ง PID ผู้ใช้ FD ขนาดอุปกรณ์ประเภท / ปิด NODE NAME

โหนด 21521 อูบุนตู 12u IPv6 345668 0t0 TCP *: 8000 (ฟัง)

$:kill -9 21521

มันจะฆ่า processId ที่สอดคล้องกับ TCP *: 8000



2

คุณสามารถใช้fuserเพื่อให้ได้สิ่งที่ต้องการ

ในการรับรหัสกระบวนการของงานที่ทำงานบนพอร์ตคุณสามารถทำได้:

fuser <<target_port>>/tcp

สมมติว่าพอร์ตคือ 8888 คำสั่งจะกลายเป็น:

fuser 8888/tcp

และหากต้องการฆ่ากระบวนการที่ทำงานอยู่บนพอร์ตเพียงเพิ่มสวิตช์ -k

fuser <<target_port>>/tcp -k

ตัวอย่าง (พอร์ต 8888):

fuser 8888/tcp -k

แค่นั้นแหละ! มันจะปิดกระบวนการฟังบนพอร์ต ฉันมักจะทำสิ่งนี้ก่อนที่จะใช้แอปพลิเคชันเซิร์ฟเวอร์ของฉัน


1

กรณีการใช้งานของฉัน: บนMacOS , รัน / รันหลายโหนดเซิร์ฟเวอร์บนพอร์ตอื่นจากสคริปต์

วิ่ง :"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

stop1 :"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

stop2, stop3 ...

วิ่งใหม่ :"stop1 & stop2 & ... & stopN ; run

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการค้นหากระบวนการโดยพอร์ต: ใครกำลังฟังพอร์ต TCP ที่ระบุบน Mac OS X


0

สำหรับ windows ให้ค้นหา PID ด้วยหมายเลขพอร์ตของคุณก่อน

netstat -ano | findStr "portNumber"

หลังจากนั้นฆ่างานให้แน่ใจว่าคุณอยู่ในรากของไดรฟ์ "c" ของคุณป้อนคำอธิบายรูปภาพที่นี่ และคำสั่งจะเป็นtaskkill /F /PID your pid


0

ถ้าคุณใช้ VS Code และเลือกเทอร์มินัลโหนดจากดรอปดาวน์ด้านขวาก่อนจากนั้นทำ Ctrl + C จากนั้นจะทำงาน

ป้อนคำอธิบายรูปภาพที่นี่

กด y เมื่อคุณได้รับพร้อมท์

ป้อนคำอธิบายรูปภาพที่นี่

ขอบคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.