종료하기 전에 신호를 트랩하고 비동기 작업을 수행 할 수 있습니다.
process.on('exit', function() {
// Do some cleanup such as close db
if (db) {
db.close();
}
});
// catching signals and do something before exit
['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT',
'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM'
].forEach(function (sig) {
process.on(sig, function() {
terminator(sig);
console.log('signal: ' + sig);
});
});
function terminator(sig) {
if (typeof sig === "string") {
// call your async task here and then call process.exit() after async task is done
myAsyncTaskBeforeExit(function() {
console.log('Received %s - terminating server app ...', sig);
process.exit(1);
});
}
console.log('Node server stopped.');
}
코멘트에서 요청 세부 사항 추가 : 이런 식으로 뭔가가 (코드에서 심지어 자바 스크립트 오류) 종료하기 전에 종료() 함수를 호출합니다
- 신호가 노드의 documentation에서 설명을,이 링크 표준을 말한다 POSIX signal names
- 신호는 문자열이어야합니다. 그러나 다른 사람들이 수표를 사용하여 내가 예상치 못한 신호가있을 수 있음을 알았습니다. 그냥 process.exit()를 호출하기 전에 확인하고 싶습니다. 어쨌든 수표를 찍는 데 많은 시간이 걸리지 않는다고 생각합니다.
- for db.close(), 나는 그것이 당신이 사용하고있는 드라이버에 달려 있다고 생각합니다. 비동기 동기화 여부. 비동기이며 db가 닫힌 후에도 아무 것도 할 필요가 없더라도 async db.close()는 닫기 이벤트 만 내보내고 서버가 종료했는지 여부에 관계없이 이벤트 루프가 계속 처리합니다.
출처
2016-11-13 14:12:07
Ben
모든 코드를 별도의 파일 (예 : afterExit.js)에 넣고 exit 이벤트가 발생하면 'require ('child_process '). exec ('node afterExit.js ');'를 실행하는 것이 좋습니다. 생각했지만 – Molda
@Molda 헤이 또, 나는 잠시 동안 그 문제를 떠났고, 지금은 일하고, 외부 스크립트를 사용하여 당신이 쉬운 해결책이 될 것이라고 제안한 것처럼 실행하겠다고 생각했다. 그러나 나는 어떤 방법을 오해하는지에 대해 오해했다. 해당 스크립트의 변수는 'afterExit'코드가 부모의 상태에 따라 다르므로 어떤 도움이라도 대단히 감사하겠습니다! –
일부 변수를 매개 변수로 전달할 수 있습니다. exec ('node afterExit.js some_param some_other_param'); 그리고'process.args'를 사용하여 액세스하거나 필요한 데이터가있는 json 파일을 만들고 해당 파일의 경로를 스크립트에 전달하고 afterExit에서 해당 파일을로드하십시오.js – Molda