명령 행에서 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.