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

Relaterade artiklar