NodeJS 프로 세 스 가 어떻게 종료 되 었 는 지 자세히 이야기 하 세 요.

머리말
NodeJS 프로 세 스 를 종료 시 킬 수 있 는 몇 가지 요소 가 있 습 니 다.이런 요소 중 일 부 는 예방 할 수 있다.예 를 들 어 코드 가 이상 을 던 졌 다.어떤 것 은 예방 할 수 없 는 것 이다.예 를 들 어 메모리 가 다 떨 어 지 는 것 이다.process 라 는 전역 변 수 는 Event Emitter 인 스 턴 스 입 니 다.프로 세 스 가 우아 하 게 종료 되면 process 는 exit 사건 을 보 냅 니 다.응용 코드 는 이 사건 을 감청 하여 마지막 청 소 를 할 수 있다.
아래 표 는 프로 세 스 를 종료 시 킬 수 있 는 요 소 를 열거 했다.
조작 하 다.
예 를 들다
수 동 으로 끝내기
process.exit(1)
캡 처 되 지 않 은 이상
throw new Error()
처리 되 지 않 은 promise rejection
Promise.reject()
처리 되 지 않 은 error 이벤트
EventEmitter#emit('error')
처리 되 지 않 은 신호
kill
자 진 탈퇴
process.exit(code)는 프로 세 스 를 가장 직접적 으로 끝 내 는 방법 입 니 다.code 인 자 는 선택 할 수 있 습 니 다.0~255 사이 의 모든 숫자 로 기본 값 은 0 입 니 다.0 은 프로 세 스 가 성공 적 으로 실행 되 었 음 을 나타 내 고 0 이 아 닌 숫자 는 프로 세 스 가 실 패 했 음 을 나타 낸다.
process.exit()가 사용 되 었 을 때 콘 솔 은 출력 이 없 을 것 입 니 다.프로 세 스 가 출시 되 었 을 때 콘 솔 처럼 잘못된 설명 정 보 를 출력 하려 면 호출 전에 표 시 된 출력 오류 정보 가 필요 합 니 다.

node -e "process.exit(42)"
echo $?
위의 코드 는 NodeJS 프로 세 스 를 직접 종료 하 였 으 며 명령 행 에는 출력 정보 가 없습니다.사용자 가 프로 세 스 가 종료 되 었 을 때 올 바른 오류 정 보 를 가 져 올 수 없습니다.

function checkConfig(config) {
  if (!config.host) {
    console.error("Configuration is missing 'host' parameter!");
    process.exit(1);
  }
}
위의 코드 에서 프로 세 스 가 종료 되 기 전에 출력 한 명확 한 오류 정보 입 니 다.
process.exit()의 기능 은 매우 강하 지만 도구 라 이브 러 리 에서 사용 해 서 는 안 됩 니 다.만약 도구 라 이브 러 리 에서 발생 한 오류 가 있다 면,우 리 는 이상 한 형식 으로 던 져 서,응용 코드 가 이 오 류 를 어떻게 처리 할 것 인 가 를 결정 하도록 해 야 한다.
Exceptions,Rejections,Emitted Errors
process.exit()는 시작 설정 검사 등 장면 에서 매우 유용 하지만 실행 중 이상 을 처리 할 때 적용 되 지 않 습 니 다.다른 도구 가 필요 합 니 다.
예 를 들 어 HTTP 요청 을 처리 할 때 오류 가 프로 세 스 를 종료 시 키 지 말 아야 합 니 다.반대로 잘못된 정 보 를 포함 한 응답 을 되 돌려 야 합 니 다.
Error 클래스 는 스 택 과 오류 텍스트 를 호출 하 는 등 오류 발생 에 대한 자세 한 정 보 를 설명 하 는 데 이 터 를 포함 할 수 있 습 니 다.일반적으로 우 리 는 특정한 장면 의 XXXError 를 정의 하 는데 이런 XXXError 는 모두 Error 류 를 계승 한다.
throw 키 워드 를 사용 하거나 코드 논리 가 잘못 되 었 을 때 오류 가 발생 합 니 다.이 때 시스템 호출 스 택 은 현재 호출 된 try/catch 문 구 를 만 날 때 까지 모든 함수 가 종 료 됩 니 다.try/catch 문구 가 없 으 면 이 오 류 는 캡 처 되 지 않 은 이상 으로 여 겨 집 니 다.
일반적으로 NodeJS 응용 프로그램 에서 저 희 는 Error 류 에 code 속성 을 정의 합 니 다.구체 적 인 오 류 를 설명 하 는 오류 코드 로 서 오류 코드 를 유일 하 게 유지 할 수 있 고 오류 코드 를 읽 을 수 있 는 장점 이 있 습 니 다.또한,우 리 는 message 속성 에 맞 춰 구체 적 인 오류 정 보 를 설명 할 수 있 습 니 다.
캡 처 되 지 않 은 이상 을 던 질 때 콘 솔 은 호출 스 택 을 인쇄 하고 프로 세 스 가 종료 되 며 종료 상태 코드 는 1 입 니 다.

/tmp/foo.js:1
throw new TypeError('invalid foo');
^
Error: invalid foo
    at Object.<anonymous> (/tmp/foo.js:2:11)
    ... TRUNCATED ...
    at internal/main/run_main_module.js:17:47
이 콘 솔 출력 정 보 는 foo.js 의 두 번 째 줄 11 열 에서 오류 가 발생 했 음 을 설명 합 니 다.
전역 변수 프로 세 스 는 이벤트 Emitter 인 스 턴 스 로 uncaughtException 이 벤트 를 감청 하여 캡 처 되 지 않 은 이상 을 처리 할 수 있 습 니 다.다음 코드 는 어떻게 사용 하 는 지 보 여 줍 니 다:

const logger = require("./lib/logger.js");
process.on("uncaughtException", (error) => {
  logger.send("An uncaught exception has occured", error, () => {
    console.error(error);
    process.exit(1);
  });
});
Promise Rejection 은 던 지 는 것 과 유사 합 니 다.우 리 는 reject()함 수 를 호출 하거나 async 함수 에서 이상 을 던 질 수 있 습 니 다.아래 의 두 단락 코드 기능 은 비슷 하 다.

Promise.reject(new Error("oh no"));

(async () => {
  throw new Error("oh no");
})();

현재 NodeJS 14 에 서 는 Promise Rejection 이 프로 세 스 를 종료 시 키 지 않 으 며,후속 버 전에 서 는 Promise Rejection 이 프로 세 스 를 종료 시 킬 수 있 습 니 다.
다음은 캡 처 되 지 않 은 Promise Rejection 의 콘 솔 출력 사례 입 니 다.
(node:52298) UnhandledPromiseRejectionWarning: Error: oh no
    at Object. (/tmp/reject.js:1:16)
    ... TRUNCATED ...
    at internal/main/run_main_module.js:17:47
(node:52298) UnhandledPromiseRejectionWarning: Unhandled promise
  rejection. This error originated either by throwing inside of an
  async function without a catch block, or by rejecting a promise
  which was not handled with .catch().
저 희 는 unhandled Rejection 이 벤트 를 감청 함으로써 캡 처 되 지 않 은 Rejection 을 처리 할 수 있 습 니 다.샘플 코드 는 다음 과 같 습 니 다.

process.on("unhandledRejection", (reason, promise) => {});
Event Emitter 는 NodeJS 의 기본 모듈 로 광범 위 하 게 응용 된다.Event Emitter 의 error 이벤트 가 처리 되 지 않 으 면 Event Emitter 에서 오류 가 발생 하고 프로 세 스 가 종 료 됩 니 다.다음은 Event Emitter error 의 콘 솔 출력 입 니 다.
events.js:306
    throw err; // Unhandled 'error' event
    ^
Error [ERR_UNHANDLED_ERROR]: Unhandled error. (undefined)
    at EventEmitter.emit (events.js:304:17)
    at Object. (/tmp/foo.js:1:40)
    ... TRUNCATED ...
    at internal/main/run_main_module.js:17:47 {
  code: 'ERR_UNHANDLED_ERROR',
  context: undefined
}
따라서 이벤트 Emitter 를 사용 할 때 error 사건 을 감청 한 것 을 확보 해 야 합 니 다.이렇게 하면 오류 가 발생 했 을 때 응용 프로그램 이 이러한 오 류 를 처리 하고 무 너 지지 않도록 할 수 있 습 니 다.
시그 널
신 호 는 조작 정보 가 프로 세 스 간 통신 체 제 를 제공 하 는 것 이다.신 호 는 보통 숫자 이 며 문자열 로 표시 할 수 있다.예 를 들 어 SIGKILL 표지 숫자 9.서로 다른 운영 체제 가 신호 에 대한 정의 가 다르다.아래 표 에는 기본적으로 통용 되 는 신호 정의 가 나열 되 어 있다.
명칭.
숫자.
처리 가능 여부
NodeJS 기본 동작
신호 의 의미
SIGHUP
1
Yes
탈퇴
부모 명령 줄 이 닫 혔 습 니 다.
SIGINT
2
Yes
탈퇴
명령 행 이 Ctrl+C 인 터 럽 트 를 시도 합 니 다.
SIGQUIT
3
Yes
탈퇴
명령 행 에서 Ctrl+Z 를 종료 하려 고 시도 합 니 다.
SIGKILL
9
No
탈퇴
강제 프로 세 스 종료
SIGUSR1
10
Yes
디 버 거 시작
사용자 정의 신호
SIGUSR2
12
Yes
탈퇴
사용자 정의 신호
SIGTERM
15
Yes
탈퇴
프로 세 스 우아 한 종료
SIGSTOP
19
No
탈퇴
프로 세 스 가 강제로 정지 되 었 습 니 다.
이 표 에서 이 신호 가 프로 세 스 에 의 해 수신 되 고 처 리 될 수 있 는 지 여 부 를 처리 할 수 있 습 니까?NodeJS 기본 동작 은 프로 세 스 가 이 신 호 를 받 은 후에 기본적으로 실행 되 는 동작 을 표시 합 니 다.
우 리 는 다음 과 같은 방식 으로 이 신 호 를 감청 할 수 있다.

#!/usr/bin/env node
console.log(`Process ID: ${process.pid}`);
process.on("SIGHUP", () => console.log("Received: SIGHUP"));
process.on("SIGINT", () => console.log("Received: SIGINT"));
setTimeout(() => {}, 5 * 60 * 1000); // keep process alive
명령 행 창 에서 이 코드 를 실행 하고 Ctrl+C 를 누 르 면 프로 세 스 가 종료 되 지 않 고 콘 솔 에서 SIGINT 신 호 를 받 은 로그 정 보 를 인쇄 합 니 다.명령 행 창 을 새로 만 들 고 다음 명령 을 수행 합 니 다.PROCESSID 는 위 프로그램 에서 출력 한 프로 세 스 ID 입 니 다.

kill -s SIGHUP <PROCESS_ID>
새로 시작 한 명령 행 을 통 해 우 리 는 원래 의 프로그램 프로 세 스에 SIGHUP 신 호 를 보 냈 습 니 다.원래 의 명령 행 창 에 SIGHUP 신 호 를 받 은 로그 정 보 를 인쇄 합 니 다.
NodeJS 코드 에서 도 프로 세 스 가 다른 프로 세 스에 신 호 를 보 낼 수 있 습 니 다.예 를 들 면:

node -e "process.kill(<PROCESS_ID>, 'SIGHUP')"
이 코드 역시 첫 번 째 명령 행 창 에서 SIGHUP 신 호 를 받 은 로 그 를 출력 합 니 다.
첫 번 째 명령 행 창의 프로 세 스 를 종료 하려 면 아래 명령 을 통 해 이 루어 질 수 있 습 니 다.

kill -9 <PROCESS_ID>
NodeJS 에서 신 호 는 프로 세 스 를 우아 하 게 종료 하 는 데 사 용 됩 니 다.예 를 들 어 Kubernetes 에서 pod 가 종료 하려 고 할 때 k8s 는 pod 내 프로 세 스 처럼 SIGTERM 신 호 를 보 내 고 30 초 동안 타 이 머 를 시작 합 니 다.응용 프로그램 은 연결 을 닫 고 데 이 터 를 저장 하 는 데 30 초 의 시간 이 있다.30 초 후에 도 프로 세 스 가 살아 남는다 면 k8s 는 프로 세 스 를 강제로 닫 는 SIGKILL 을 다시 보 냅 니 다.
작은 매듭
본 고 는 프로 세 스 의 퇴출 을 초래 할 수 있 는 몇 가지 요 소 를 다 루 었 는데 그것 이 바로 다음 과 같다.
주동 적 으로 탈퇴 하 다.
  • 캡 처 되 지 않 은 이상,처리 되 지 않 은 promise rejection,처리 되 지 않 은 이벤트 Emitter error 사건
  • 시스템 신호
    NodeJS 프로 세 스 가 어떻게 종료 되 었 는 지 에 대한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 NodeJS 프로 세 스 종료 내용 은 이전 글 을 검색 하거나 아래 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기