javascript - Stoppa alla instanser av Node.js-server
Jag har startat en Node-server via ett plugins i en IDE. Tyvärr kan jag inte använda IDE:ns terminal. Så jag försökte köra skriptet från kommandoraden.
Det här är problemet - jag använder Express-modulen och min app lyssnar på någon port (8080). När jag startar appen från kommandoraden får jag detta fel:
events.js:71
throw arguments[1]; // Unhandled 'error' event
^
Error: listen EADDRINUSE
at errnoException (net.js:770:11)
at HTTPServer.Server._listen2 (net.js:910:14)
at listen (net.js:937:10)
at HTTPServer.Server.listen (net.js:986:5)
at Object.<anonymous> (C:\xampp\htdocs\node\chat\app.js:5:5)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.runMain (module.js:492:10)
Även om jag inte är helt säker på vad detta fel kan vara antog jag att det beror på att appen lyssnar på en port som redan är i användning. Så jag gjorde:
netstat -an
Jag kan se
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING
Det är för att Node-servern redan är startad när jag försökte starta den från IDE:n.
Så jag vill veta, hur kan jag stoppa alla serverinstanser? Och om du också kan berätta hur man upptäcker vad som körs på en port och dödar det.
Svar #1
Windows-dator:
Om du behöver stänga en Node.js-server och du inte har några andra Node-processer som körs, kan du be din dator att avsluta alla processer som heter node.exe. Det skulle se ut så här:
taskkill /im node.exe
Och om processerna fortfarande kvarstår kan du tvinga processerna att avslutas genom att lägga till flaggan /f:
taskkill /f /im node.exe
Om du behöver mer detaljerad kontroll och endast vill döda en server som kör på en specifik port, kan du använda netstat för att hitta process-ID:t, och sedan skicka en kill-signal till det. Så i ditt fall, där porten är 8080, kan du köra följande:
C:\>netstat -ano | find "LISTENING" | find "8080"
Den femte kolumnen i utdata är process-ID:t:
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 14828
TCP [::]:8080 [::]:0 LISTENING 14828
Du kan då döda processen med taskkill /pid 14828. Om processen vägrar att avsluta, lägg bara till /f (tvinga) parametern till kommandot.
MacOS-dator:
Processen är nästan identisk. Du kan antingen avsluta alla Node-processer som körs på maskinen:
killall node
Eller också som antytts i @jacob-groundwater:s svar nedan med hjälp av lsof, kan du hitta PID för en process som lyssnar på en port (skicka -i-flaggan och porten för att avsevärt påskynda detta):
lsof -Pi :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 1073 urname 22u IPv6 bunchanumbershere 0t0 TCP *:8080 (LISTEN)
Process-ID i det här fallet är numret under kolumnen PID, som du sedan kan skicka till kill-kommandot:
kill 1073
Om processen vägrar avsluta, använd då bara flaggan -9, som är en SIGTERM och inte kan ignoreras:
kill -9 1073
Linux-maskin:
Återigen är processen nästan identisk. Du kan antingen döda alla Node-processer som körs på datorn (använd -$SIGNAL om SIGKILL är otillräckligt):
killall node
Eller genom att använda netstat kan du hitta PID för en process som lyssnar på en port:
netstat -nlp | grep :8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1073/node
Process-ID:t i det här fallet är numret framför processnamnet i den sjätte kolumnen, som du sedan kan skicka till kill-kommandot:
kill 1073
Om processen vägrar avsluta, använd då bara flaggan -9, som är en SIGTERM och inte kan ignoreras:
kill -9 1073
Svar #2
Fungerar för Linux, OS X
killall node
Svar #3
Du kan använda lsof för att få processen som har bundit till den nödvändiga porten.
Tyvärr verkar flaggorna vara olika beroende på system, men på Mac OS X kan du köra
lsof -Pi | grep LISTEN
Till exempel får jag på min dator något som liknar:
mongod 8662 jacob 6u IPv4 0x17ceae4e0970fbe9 0t0 TCP localhost:27017 (LISTEN)
mongod 8662 jacob 7u IPv4 0x17ceae4e0f9c24b1 0t0 TCP localhost:28017 (LISTEN)
memcached 8680 jacob 17u IPv4 0x17ceae4e0971f7d1 0t0 TCP *:11211 (LISTEN)
memcached 8680 jacob 18u IPv6 0x17ceae4e0bdf6479 0t0 TCP *:11211 (LISTEN)
mysqld 9394 jacob 10u IPv4 0x17ceae4e080c4001 0t0 TCP *:3306 (LISTEN)
redis-ser 75429 jacob 4u IPv4 0x17ceae4e1ba8ea59 0t0 TCP localhost:6379 (LISTEN)
Det andra numret är PID och porten de lyssnar på finns till höger innan "(LISTEN)". Hitta den avvikande PID och kill -9 $PID för att avsluta med extremt prejudikat.
Svar #4
Windows & GitBash-terminal Jag behövde använda detta kommando i Windows/Webstorm/GitBash-terminalen
cmd "/C TASKKILL /IM node.exe /F"
Svar #5
Om du vill döda en specifik nodprocess kan du gå till kommandoradsrutten och skriva:
ps aux | grep node
för att få en lista över alla Node-process-ID:n. nu kan du få ditt process-ID (pid), sedan göra:
kill -9 PID
och om du vill döda alla node-processer, gör då:
killall -9 node
-9-omkopplaren är som Avsluta uppgift i Windows. Den tvingar processen att avslutas. Du kan göra:
kill -l
att se alla switchar för kommandot kill och deras kommentarer.
Svar #6
Linux
För att imponera på dina vänner
ps aux | grep -i node | awk '{print $2}' | xargs kill -9
Men det här är den du kommer att minnas
killall node
Svar #7
Du kan prova detta:
taskkill /IM node.exe -F
