Node.js에서 종료하는 방법


1866

종료하는 데 사용되는 명령은 무엇입니까? (즉 Node.js 프로세스를 종료)

답변:


2375

전역 process객체의 exit메소드를 호출하십시오 .

process.exit()

문서에서 :

process.exit ([코드])

지정된로 프로세스를 종료합니다 code. 생략하면 exit는 '성공'코드를 사용합니다 0.

'실패'코드로 종료하려면 :

process.exit(1);

노드를 실행 한 쉘은 종료 코드를로 표시해야합니다 1.


5
무언가를 추가하고 싶습니다. 요청을 처리하는 경우에도 end()요청 해야 합니다. 그렇지 않으면 그냥 중단됩니다.
pixelfreak

126
@pixelfreak exit은 전혀 오도하지 않습니다. Node의 작동 방식에 대해 혼란스러워합니다. Node를 서버 자체로 생각하십시오. PHP가 Apache와 같은 웹 서버에있는 것처럼 필요에 따라 실행되지 않습니다. 노드는 웹 서버와 전혀 관련이 없습니다! 유용한 작업을 수행하기위한 멋진 내장 라이브러리가있는 일부 JavaScript의 호스트 일뿐입니다.
브래드

6
@Brad 그리고 PHP는 범용 언어입니다. mod_phpApache 로 실행 하거나 사용할 필요가 없습니다 . 노드에서와 마찬가지로 FastCGI와 같이 더 정교하고 표준화 된 접근 방식을 실제로 원하거나 사용하는 경우 PHP와 같이 httpd에서 노드를 다시 구현할 수 있습니다.
binki

38
참고 사항 process.exit()되어 바람직하지 에 설명 된대로 아래의이 답변을 .
AndreasPizsa

409

그냥 참고 사용하는 것으로는 process.exit([number])것입니다 권장하지 연습.

호출 process.exit()은 아직 완료되지 않은 비동기 작업이 아직 완료되지 않은 경우에도 process.stdout및에 대한 I / O 작업을 포함하여 프로세스를 최대한 빨리 종료 process.stderr합니다.

대부분의 상황에서 실제로 process.exit()명시 적으로 호출 할 필요는 없습니다 . 이벤트 루프에 보류중인 추가 작업이 없으면 Node.js 프로세스가 자체적으로 종료됩니다. process.exitCode속성은 종료 코드가 때 프로세스가 종료 정상적으로 사용하는 과정을 말하도록 설정할 수 있습니다.

예를 들어, 다음 예제는 인쇄 된 데이터 가 잘리고 손실 될 수 있는 방법 의 오용 을 보여줍니다 .process.exit()stdout

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exit(1);
}

이것이 문제가되는 이유는 process.stdoutNode.js의 쓰기가 비동기 적이며 Node.js 이벤트 루프의 여러 틱에서 발생할 수 있기 때문 입니다. process.exit()그러나을 호출 하면 추가 쓰기를 stdout수행 하기 전에 프로세스가 강제 종료 됩니다.

process.exit()코드는 직접 호출하는 대신 process.exitCode이벤트 루프에 대한 추가 작업을 예약하지 않도록 설정하여 프로세스가 자연스럽게 종료되도록 해야 합니다.

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}

31
이것이 가장 좋은 대답입니다. 다른 답변은 종료 전에 노드가 보류중인 이벤트를 올바르게 처리하지 못하게 할 수 있습니다. 매우 슬픈 :(
djabraham 5

3
동의, 더 많은 투표를해야합니다! shelljs.exec를 통해 여러 자식 프로세스를 시작하는 노드 스크립트가 있었고 자식 프로세스 중 하나라도 실패하면 전체 스크립트가 오류 종료 코드와 함께 반환되기를 원했습니다. process.exitCode = 1은 exec 콜백에서 훌륭하게 작동했습니다 (단, process.exit (1)을 호출하면 모든 자식 프로세스가 완료되기 전에 기본 스크립트가 종료됩니다!)
Nick

15
나는이 대답을 사용했고 내 프로세스가 실제로 종료되지 않았다는 것을 알았습니다. ctrl-C해야했습니다.
jcollum

33
즉각적인 프로세스 및 보류중인 이벤트 종료에 대한 많은 사용 사례가 있습니다. 그것은 정확히 process.exit()의도 된 것입니다.
Dominic Cerisano

6
이것은 질문에 대답하지 않기 때문에 어떤 식 으로든 가장 좋은 대답은 아닙니다. 대신 nodejs 프로그램의 코드 흐름을 개발하는 방법에 대한 모범 사례를 제공합니다.
anon58192932

365

공식 nodejs.org 문서에서 :

process.exit(code)

지정된 코드로 프로세스를 종료합니다. 생략하면 exit는 '성공'코드 0을 사용합니다.

'실패'코드로 종료하려면 :

process.exit(1);

9
@Alison 예 또는 더 정확하게code = 0; process.exit(code);
wprl

7
당신이 나가고 있다면 아마도 당신의 가치에 신경 쓰지 않는 것이 사실 code입니까?
Armand

8
@Alison 더 나은 아이디어는 process.exit()코드가 0으로 기본 설정되어 있으므로 매개 변수가없는 것입니다.
Jeremy Moritz

2
@Armand 맞습니다. 코드는 변수 일 뿐이며이 경우 매개 변수가 무엇인지 나타내는 데 사용됩니다. 따라서 .exit (0)은 예제의 모든 기능을 수행합니다.
Gerard ONeill 2016 년

23
@Armand 코드는 당신을위한 것이 아니며 코드를 실행 한 모든 것을위한 것입니다. 예를 들어, exit_0.js를 사용하여 생성하고이를 process.exit(0);실행하면 node exit_0.js && echo 'success'"성공"이라고 표시됩니다. exit_1.js를 사용하여 작성 process.exit(1);하고 실행 node exit_1.js && echo 'success'하면 프로세스가 0이 아닌 것으로 종료되므로 "성공"으로 표시되지 않습니다 (쉘에 "실패"또는 "비정상 종료"를 나타냄). 또한 $?실행하면 node exit_1.jsvs 에 다른 값이 표시됩니다 node exit_0.js(를 수행 node exit_1.js한 다음 수행 하여 확인할 수 있음 echo $?).
msouth

277

Unix 터미널 또는 Windows 명령 행에 있고 Node REPL을 종료하려면 다음 중 하나를 수행하십시오.

  • Ctrl+를 C두 번 누르 거나
  • 입력 .exit하고 Enter를 누르십시오. 또는
  • 줄의 시작 부분에서 Ctrl+ D를 누르십시오 (Unix 만 해당)

14
Node 이외에도 Mac 또는 Linux의 Ctrl + D 단축키는 Bash와 같은 Unix 쉘, MySQL 및 PostgreSQL과 같은 데이터베이스 쉘, 프로그래밍 언어와 같은 REPL을 포함하여 거의 모든 쉘 및 REPL에서 작동합니다. 파이썬, PHP 및 루비. 내가 사용한 쉘을 종료하는 유일한 방법입니다.
Mark Amery 22시 52 분

2
를 들어 node그것은 또한 Windows에서 작동하므로 REPL을 종료하려면 Ctrl + D는 표준 동작입니다.
Alan

Ctrl + C를 누릅니다 (Mac에서도!)
Prince

124

명령 행에서 .exit원하는 것이 있습니다.

$ node
> .exit
$

REPL docs에 문서화되어 있습니다. REPL (Read-Eval-Print-Loop)은 노드 명령 행이라고합니다.

일반 프로그램에서을 사용하십시오 process.exit([code]).


79

node.js 프로세스를 종료하려는 이유에 따라 다르지만 process.exit(), 마지막으로 고려해야 할 옵션이 있습니다. 설명서의 인용문 :

그것은주의하는 것이 중요하다 호출 process.exit()여전히 아직 O의에 운영 I을 /를 포함, 완전히 완료되지 않은 보류중인 비동기 작업이있는 경우에도 가능한 한 빨리으로 출구 프로세스를 강제 process.stdout하고 process.stderr.

대부분의 상황에서 실제로 process.exit()명시 적으로 호출 할 필요는 없습니다 . 이벤트 루프에 보류중인 추가 작업이없는 경우 Node.js 프로세스가 자체적으로 종료됩니다. process.exitCode속성은 종료 코드가 때 프로세스가 종료 정상적으로 사용하는 과정을 말하도록 설정할 수 있습니다.

node.js 프로세스를 기꺼이 종료 할 수있는 이유와 피해야하는 이유에 대해 살펴 보겠습니다 process.exit().

사례 1-실행 완료 (명령 줄 스크립트)

스크립트가 종료되고 노드 인터프리터가 종료되지 않으면 일부 비동기 작업이 여전히 보류 중임을 나타냅니다. process.exit()이 시점에서 프로세스를 강제 종료하는 것은 잘못 입니다. 스크립트가 예상대로 종료되지 않도록하는 것이 무엇인지 이해 하는 것이 좋습니다 . 이를 해결하면 process.exitCode호출 프로세스에 결과를 반환하는 데 사용할 수 있습니다 .

사례 2-외부 신호로 인한 종료 (SIGINT / SIGTERM / 기타)

예를 들어 Express 앱 을 정상적으로 종료하려는 경우 . 명령 줄 스크립트와 달리 Express 앱은 새로운 요청을 기다리면서 계속 실행됩니다. process.exit()파이프 라인에있는 모든 요청을 중단 시키므로 여기서 잘못된 옵션이됩니다. 그리고 그중 일부는 비등 전성일 수도 있습니다 (UPDATE, DELETE). 클라이언트는 해당 요청이 서버 쪽에서 완료되었는지 여부를 절대 알 수 없으며 클라이언트와 서버간에 데이터가 일치하지 않을 수 있습니다. 유일한 좋은 해결책은 http 서버에 새 요청 수락을 중지하고 보류중인 요청이 끝날 때까지 기다리도록하는 것입니다 server.close().

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

여전히 종료되지 않으면 사례 1을 참조하십시오.

사례 3-내부 오류

항상 throw오류 보다 낫습니다 . 형식이 잘 지정된 스택 추적 및 오류 메시지가 나타납니다. 상위 수준의 코드는 항상 오류를 처리 할 수 ​​있는지 ( catch) 프로세스를 중단 시킬 수 있는지 결정할 수 있습니다 . 다른 한편으로, process.exit(1)프로세스를 자동으로 종료하고 이로부터 복구 할 기회가 없습니다. 의 유일한 "혜택" process.exit()일 수 있습니다. 프로세스가 종료 될 것임을 확신 할 수 있습니다.


4
놀라운 반응. Process.exit()대부분의 응용 프로그램에서 큰 과잉으로 보입니다. 나는 PHP의 다이에 상응하는 찾고 있었다 () 함수 ... 더 같은 :throw new Error('die msg')
AvadData

종료 요청이 수신 될 때까지 지속적으로 실행되어야하는 많은 코드가있는 경우 이벤트를 사용하여 코드를 요구하지 않고 종료 요청에 대한 응답으로 구독을 취소 할 수있는 이벤트 등록 규칙이 있습니까? 또는 종료를 요청하는 코드가 서로에 대한 특정 지식을 가지고 있습니까? 불행히도, 이벤트를 등록하는 모든 코드 조각도 등록을 해제하는 클로저를 포함하는 래퍼를 만들어야하는 일종의 소르 타 구현을 생각할 수있는 유일한 방법입니다.
supercat

26

REPL (명령 줄)

  • 두 번 누르십시오ctrl + c

  • 입력 .exit하고 Enter를 누르십시오

스크립트 파일

process.exit(code)

더 이상 비동기 작업이 보류되지 않으면 노드는 일반적으로 코드 0 으로 종료됩니다 .

process.exit(1) 실패 코드와 함께 종료하는 데 사용해야합니다. 이렇게하면 노드가 정상적으로 닫히지 않고 강제로 닫 혔음을 알 수 있습니다.

같은 다른 종료 코드가 있습니다

3-내부 JavaScript 구문 분석 오류 (매우 드문 경우)

5-v8 자바 스크립트 엔진의 치명적 오류

9-잘못된 인수

전체 목록은 노드 종료 코드를 참조하십시오.


12

원하는 응용 프로그램이 있습니다.

  1. 사용자에게 이메일 보내기
  2. 오류 코드와 함께 종료

이벤트 처리기 에 연결 process.exit(code)해야했습니다. exit그렇지 않으면 호출이 process.exit(code)비동기 이벤트를 직접 종료 하므로 메일이 전송되지 않습니다 .

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });

4
나는 당신이 원하는 생각 process.exitCode
줄리안 드 Bhal

기록을 위해 : 나는 내가 만들고 process.exitCode있는 명령 줄 도구 (노드 v4.3.0에서 테스트 됨)에서 나를 위해 일 하기 위해 좋은 시간을 보냈습니다 . 그러나 나는 문서화 된대로 행동 할 수 없었습니다. 이것은 아주 잘와 에지의 경우 수 있었다 commander-하지만 github.com/tj/commander.js/...가 궁금한데. 다른 사람이 노드 4 에서이 문제를 보았는지 확실하지 않지만 나중에 참조 할 수 있도록 문서화하십시오.
mikermcneil

이것이 사령관이 올 가능성에 대해, 나는 그것의 유일한 dep ( github.com/zhiyelee/graceful-readlink/… )를 보았지만 주사위는 없었습니다. 가능한 범인은 아마도 다음과 같습니다 : github.com/tj/commander.js/blob/… 구체적으로, 문제는 당신이 설정하더라도 process.exitCode = 1프로세스가 코드 0으로 종료
된다는 것입니다.

10

@Dominic이 지적했듯이 catch되지 않은 오류를 발생시키는 것이 process.exit ([code]) 를 호출하는 대신 더 나은 방법입니다 .
process.exitCode = 1; throw new Error("my module xx condition failed");


3
"Node.js에서 종료하는 방법"이라는 질문과 관련하여 끔찍한 조언입니다. 질문이 오류로 종료하는 방법을 구체적으로 묻는다면 제안이 훨씬 더 합리적입니다. 오류가 발생 했을 때 응용 프로그램을 종료하려고 시도하는 경우에만 사용자가 제안한대로 표시하도록 응답을 표시하는 것이 좋습니다 .
rstackhouse


4
던지기 문제는 지옥 스택 추적과 같은 추악한 것입니다. 이 스택 추적을 피하기위한 팁 (사용이 올바르지 않은 경우 CLI 도구를 종료하려는 경우에는 관련이 없음)?
MoOx

9

나가기 위해서

let exitCode = 1;
process.exit(exitCode)

유용한 종료 코드

1-일반적인 오류에 대한 Catchall
2-셸 내장 오용 (Bash 설명서에 따름)
126-호출 한 명령을 실행할 수 없습니다
127-“명령을 찾을 수 없습니다”
128-잘못된 인수가 종료되었습니다
128 + n-치명적 오류 신호 "n"
130-Control-C에 의해 종료 된 스크립트
255 \ *-종료 상태가 범위를 벗어남


7

코드 에서 선택적 정수인 process.exit([errorcode])where 를 사용할 수 있습니다 [errorcode]( 0성공을 나타내는 기본값 임).

당신이 사용하는 경우 읽기 평가는 루프 (REPL)를 인쇄 , 당신이 사용할 수있는 Ctrl+ D, 또는 유형을.exit

또는 Windows 또는 Linux에서 Ctrl+ C, Ctrl+를 사용할 수 있습니다C

Mac에서 명령은 Ctrl+ Z, Ctrl+Z


2
적어도 두 가지 컨트롤 c가 맥에서도 작동합니다. node --version v0.10.18
msouth

Control-C는 이미 예약 된 작업을 취소하지 않는 반면 ctrl-z는 Mac에서 지연없이 프로세스를 종료합니다.
jorisw

7

Ctrl + C또는을 두 번 누릅니다 .exit.

> 
(To exit, press ^C again or type .exit)
> 

3

입력하여 taskkill -F -IM node.exe모든 노드 프로세스를 Windows 10의 Git Bash 셸에서 직접 죽게 할 수있었습니다. 그러면 컴퓨터의 모든 노드 프로세스가 한 번에 종료됩니다. 나는 또한 사용할 수 있음을 발견했다 taskkill //F //IM node.exe. 확실하지 왜 모두 -//작업 이러한 맥락이다. 도움이 되었기를 바랍니다!


그것은 taskkill 자체 때문입니다. 당신은 프로세스 자체를 죽이고 있습니다. 또한 단일 / 충분합니다.
Paul Stelian

2

프로세스는 전역 객체이므로 모듈을 가져올 필요가 없습니다. 다음 함수는 현재 노드 프로세스를 종료하거나 종료합니다.

process.exit (코드)

process.kill (process.pid)

process.abort ()


1

노드 애플리케이션이 실행중인 명령 행 터미널을 열고 Ctrl + C를 누르십시오.

코드에서 node js 애플리케이션을 종료하려면

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 

0

노드 js 응용 프로그램을 종료하려면 다음을 작성하십시오.

process.exit(1)

당신의 코드에서


3
1은 응용 프로그램에 오류가 있음을 나타내는 데 사용되며 다른 답변은 이미 명확합니다.
헤릭

0

노드 js의 종료는 두 가지 방법으로 수행됩니다.

  • process.exit ()를 명시 적으로 호출합니다 .
  • 또는 nodejs 이벤트 루프가 모든 작업으로 수행되면 할 일이 없습니다. 그러면 노드 응용 프로그램이 자동으로 종료됩니다.

어떻게 작동합니까?

실행 루프가 프로세스를 강제로 멈추게하려면 EventEmitter 의 인스턴스 인 전역 변수 프로세스 를 사용할 수 있습니다 . 따라서 process.exit () 를 호출하면 하면 여전히 비동기 작업이 수행되지 않은 경우에도 모든 작업을 즉시 종료 하는 exit 이벤트가 발생합니다.

process.exit () 는 종료 코드 (정수)를 매개 변수로 사용합니다. 코드 0 이 기본값이며 이는 '성공'으로 종료됨을 의미합니다. 코드 1 은 '실패'로 종료됨을 의미합니다.


0

Windows의 경우 작업 관리자로 이동 한 다음 프로세스로 이동하여 "노드"라는 프로세스를 찾은 다음 마우스 오른쪽 버튼으로 프로세스를 클릭 한 다음 "프로세스 종료"옵션을 클릭하십시오.


-1

process.exit ([code]) 함수를 사용할 수 있습니다 .

'실패'없이 종료하려면 코드를 사용하십시오 0.

process.exit(0);

'실패'코드로 끝내 1려면 다음을 실행할 수 있습니다.

process.exit(1);

실패의 '실패'코드는 애플리케이션에 따라 다릅니다. 그래서 당신은 그것에 대한 당신의 자신의 규칙을 사용할 수 있습니다.

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