명령 행에서 node.js 프로그램 중지


304

포트에서 수신 대기하는 간단한 TCP 서버가 있습니다.

var net = require("net");

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

server.listen(7777);

나는 그것을 시작 node server.js하고 닫기를 Mac에서 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 다음에 입력 하면 중단했던 위치로 돌아갑니다. 따라서 이전 노드는 여전히 실행 중입니다. 다른 명령에서도이 작업을 수행하고 있는지 확인하십시오!
— ruffin

1
@ruffin 이것은 대답이어야합니다. Ctrl+Z조치를 수행 한 경우 fg프로세스를 소생시키고 프로세스를 종료 하는 적절한 방법이 있습니다 Ctrl+C.
— Metagrapher

답변:


393

프로그램을 끝내려면 Ctrl+ 를 사용해야합니다 C. 그렇게 SIGINT하면 프로그램이 수신 대기중인 포트에서 바인딩을 해제하여 프로그램이 정상적으로 종료되도록합니다.

참조 : https://superuser.com/a/262948/48624


21
Ctrl + C나를 위해 작동하지 않습니다. ^C콘솔 에만 입력되고 프로그램이 종료되지 않습니다.
— 엘리스트

1
@Eleeist, 터미널로 무엇을 사용하고 있습니까? 그것은 나를 위해 잘 작동합니다.
— Brad

2
@Eleeist, 당신은 아마도 당신의 키나 무언가를 재 매핑했을 것입니다. Ctrl+C잘 작동합니다. 어쨌든 그것은 실제 문제와는 별개의 문제입니다. SuperUser.com에 "Ctrl + C가 작동하지 않습니다"라는 질문을 게시해야합니다.
— Brad

1
@ jt0dd 당신은 항상 할 수는 kill -9있지만, 할 수 는 없습니다. 실제로 응용 프로그램이 여전히 포트를 열어 두는 것이 확실합니까? 나는 그런 문제가 없었습니다. 응용 프로그램이 종료 되 자마자 연결이 즉시 종료됩니다. netstat를 사용하여 앱이나 다른 항목이 해당 포트에 남아 있는지 확인합니다.
— Brad

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그 (있는 거 확인이 모든 인스턴스를 죽이고 당신만큼) 정말 가장 쉽고 가장 신뢰할 수있는 옵션이 있기 때문에 당신의 대답에
— Boern

4
'killall'은 내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. 뭔가 빠졌습니까?
— Ayyash

여기에 ... 대답이 없습니까? 'killall'은 인식되지 않습니다. 다른 명령은 작동하지 않습니다. 컴퓨터를 다시 시작해야합니까?
— Methodician

37

또는이 모든 것을 한 줄로 수행 할 수도 있습니다.

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

'\ snode \ s'안의 노드를 다른 프로세스 이름으로 바꿀 수 있습니다.


2
또는 다음과 같이 항상 시도해 볼 수 있습니다. ps -ef | grep "노드"| awk '{print $ 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 노드 js REPL을 종료하도록 입력 할 수 있습니다.


2
그것은 당신이 REPL 에 있다고 가정합니다 . Node 스크립트가 실행 중이면 어떻게합니까?
— IgorGanapolsky

18

Node.js를 대화식으로 실행하는 경우 (REPL) :

Ctrl+ C는 프롬프트로 돌아가서 다음을 입력합니다 :

process.exit()

또는 그냥 Ctrl+를 사용하십시오 D.


17

$ sudo killall node다른 터미널에서는 작동 하지 않지만 mac 에서 killall node작동합니다.

$ killall node
No matching processes belonging to you were found

13

리눅스에서 시도 : pkill node

Windows에서 :

Taskkill /IM node.exe /F

또는

from subprocess import call

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

5

이것은 늦은 답변이지만 NodeJS 문서 에서 이것을 발견했습니다 .

'exit'이벤트는 .exit입력으로 명령 을 수신하거나 , 사용자가 <ctrl>-CSIGINT를 신호하기 위해 두 번 누르거나 <ctrl>-D, 입력 스트림에서 'end'신호 를 보내 려면 REPL이 종료 될 때 발생 합니다. 리스너 콜백은 인수없이 호출됩니다.

요약하면 다음과 같이 종료 할 수 있습니다.

  1. .exitnodejs REPL을 입력합니다 .
  2. <ctrl>-C두 번 누르기
  3. 를 누릅니다 <ctrl>-D.
  4. process.exit(0)REPL에서 자연스럽게 빠져 나옵니다. 다른 상태를 반환하려면 0이 아닌 숫자를 반환하면됩니다.
  5. process.kill(process.pid) 코드 내에서 또는 REPL에서 nodejs API를 사용하여 죽이는 방법입니다.

5

프로덕션 배포를 사용하는 많은 프로젝트의 경우 이러한 프로세스를 중지하는 스크립트가 있으므로 필요하지 않기 때문에이 답변을 추가하고 있습니다.

Node Server 프로세스를 관리하는 확실한 방법은 forever패키지를 사용하는 것입니다 (from 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

여러 노드 서버를 실행 하는 문제가 발생하여 서버 중 하나를 죽이고 스크립트에서 다시 배포하려고합니다.

참고 :이 예제는 Mac의 bash 쉘에 있습니다.

그렇게하려면 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 kill (여기서는 8000)에 따라 다음 명령을 사용할 수 있습니다.

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

$:lsof -i tcp:8000

다음과 같은 TCP 그룹이 제공됩니다.

명령 PID 사용자 FD 유형 장치 크기 / 꺼짐 노드 이름

노드 21521 우분투 12u IPv6 345668 0t0 TCP * : 8000 (LISTEN)

$:kill -9 21521

TCP * : 8000에 해당하는 processId를 종료합니다.



2

퓨저 를 사용 하여 원하는 것을 얻을 수 있습니다 .

포트에서 실행중인 작업의 프로세스 ID를 얻으려면 다음을 수행하십시오.

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

포트로 프로세스를 찾는 방법에 대한 자세한 정보 : 누가 Mac OS X에서 주어진 TCP 포트를 듣고 있습니까?


0

Windows의 경우 먼저 포트 번호로 PID를 검색하십시오.

netstat -ano | findStr "portNumber"

그 후, 작업을 종료하고 "c"드라이브의 루트에 있는지 확인하십시오. 여기에 이미지 설명을 입력하십시오 그러면 명령이taskkill /F /PID your pid


0

VS 코드와 터미널을 사용하는 경우 오른쪽 드롭 다운에서 먼저 노드를 선택한 다음 Ctrl + C를 수행하십시오.

여기에 이미지 설명을 입력하십시오

프롬프트가 표시되면 y를 누르십시오.

여기에 이미지 설명을 입력하십시오

감사

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.