익스프레스에 타입스크립트를 적용하는 과정에서 ts-node-dev
패키지를 설치했다. 이 패키지를 사용하기 위해 설정한 스크립트에서 --exit-child
라는 옵션을 사용했는데, 이 옵션은 SIGTERM
exit 핸들러를 자식 프로세스에 추가하는 옵션이라고 한다.
SIGTERM이 무엇인지 궁금해서 구글링해 봤는데 여러 정보를 알 수 있었다.
SIGTERM
은 프로그램을 종료하기 위해 사용하는 종료 시그널 중 하나이다. 다양한 종료 시그널들이 존재하고 종료 시그널들은 자신만의 이름을 갖는데, 그 중 하나의 이름이 SIGTERM인 것이다.
SIGTERM
SIGKILL
과 다르게 차단, 핸들링, 무시될 수 있다.kill
은 이 시그널을 발생시킨다.종료 시그널을 핸들링해야 하는 이유는 프로그램을 실제로 종료하기 전에 프로그램을 종료하기 위한 정리 작업들을 해야하기 때문이다.
만약 종료 시그널을 핸들링하지 않는 익스프레스 서버가 클라이언트의 요청을 처리하던 도중에 종료된다면 클라이언트의 요청 사항을 모두 처리하지 않고 종료될 것이다. 따라서 이런 점들을 방지하기 위해 종료 시그널을 핸들링하는 작업을 처리해야 한다.
Node.js에서도 SIGTERM 종료 시그널을 처리할 수 있다. 서버 프로그램을 종료한다는 SIGTERM 종료 시그널을 Node.js가 받게 되면 이에 해당하는 시그널 이벤트가 발생한다. 이 종료 시그널 이벤트를 시그널 핸들러 함수를 통해 처리할 수 있다. Node.js에서 시그널 핸들러는 첫 번째 인자로 시그널의 이름을 전달 받는다.
function handle(signal) {
console.log(`Received ${signal}`);
}
process.on('SIGTERM', handle);
이 예제는 간단한 Node.js 공식문서의 예제이지만 익스프레스 서버에서는 SIGTERM 시그널 핸들러 함수에 여러 정리 작업들을 추가해 익스프레스 서버를 Graceful shutdown 할 수 있다고 한다.
--exit-child
옵션이 SIGTERM exit 핸들러를 자식 프로세스에 추가한다는 것은 프로그램을 종료하면서 자식 프로세스에 SIGTERM 시그널을 처리하는 핸들러를 추가해 안전하게 자식 프로세스와 프로그램을 종료한다는 의미로 이해하였다.