π― Goals
- Node.js νλ‘μΈμ€ μ’ λ£μ μ΄λ²€νΈλ₯Ό λ°μ, κ°μ§νλ€.
- μμ£Ό μ°μ΄λ process event μ μ©λ‘μ μ£Όμμ¬νμ μμλ³Έλ€.
process.exit
When to use?
νλ‘μΈμ€ μ’ λ£ μ΄λ²€νΈλ₯Ό κ°μ§κ±°λ μΆκ° μμ μ νκ³ μΆμ λ
ex) λ‘κΉ
When this occur?
exit μ΄λ²€νΈκ° emit λλ μν©μ λ€μκ³Ό κ°λ€.
- μ½μ€ν, μ½λ°±ν, μ‘νκ° λͺ¨λ λΉμμ Έμ λ μ΄μ ν μΌμ΄ μμ λ == μ μ μ’ λ£ (exit code 0)
- process.exit(N) λ‘ μ§μ μ’ λ£ μ΄λ²€νΈ μ λ¬(emit).
- Exception λ°μμ exit code 1 (λ¨, process.on('uncaughtException') λ―Έλ±λ‘μ)
λ±λ‘νμ κ²½μ° exit code 0μΌλ‘ μ’ λ£
ππ» λΉμ°ν κ²μ΄, νλμ ν μ€ν¬(μ΄λ²€νΈ 리μ€λ)κ° event queue μ μΆκ°λκ³ μ μμ μΌλ‘ μ²λ¦¬λλ©΄ μ’ λ£ μ½λκ° μλμΌλ‘ 0μΌλ‘ λ³νλλ€.
β οΈ Execption μ΄ μλ async funciton λ΄μμ throw (reject) κ° λ°μνλ©΄ process.exit μ΄ λ°λνμ§ μλλ€.
μ΄ λλ process.on('unhandledRejection') μ λ±λ‘ν΄μ μ²λ¦¬ν΄μ€μΌνλ€.
μμ μ½λ
// Use `beforeExit`
// When event loop has no additional work to schedule.
// Normally, Node.js process will exit when there is no work scheduled.
// But a listener registered on `beforeExit` event can make asynchronous call, thereby Node.js process to continue.
// explicit termination μ `beforeExit` μ΄ λ°λνμ§ μμ.
// ππ» μ΄λλ μ€λ‘μ§ 'exit' μ΄λ²€νΈλ§ λ°μ λλ uncaughtException λ°λ.
// Explicit termination examples
// (1) calling process.exit()
// (2) uncaught exceptions.
// μ 2κ°μ§ μΌμ΄μ€λ Callback queue, job queue μ μΌμ΄ λ¨μμμ΄λ λ°λ‘ μ’
λ£.
process.on('beforeExit', (code)=>{
logger.error({
exitCode: code,
message: 'Process exit!',
timestamp: new Date(),
});
});
// 0 μΈμλ λͺ¨λ λ°μ
process.on('exit', (code)=>{
console.log(`exit code : ${code}`);
if(code !== 0) {
logger.error({
exitCode: code,
message: "I'm gone",
timestamp: new Date(),
});
}
});
// [Default Behavior]
// μ΄κ² μμΌλ©΄ λ³΄ν΅ process.stderr.fd μ μ°ν λ΄μμ logging νκ³ μ’
λ£ν¨.
// exitCode 1 κ³Ό ν¨κ».
// process.on('uncaughtException') μ μ΄ κΈ°λ³Έ behavior λ₯Ό μ€λ²λΌμ΄λ© νλκ².
process.on('uncaughtException', (err)=>{
console.error('exception');
logger.error({
exitCode: err.name,
message: err.message,
timestamp: new Date(),
});
// μλμ κ°μ΄ μΌλΆλ¬ exitCodeλ₯Ό μμ ν μ μμ.
process.exitCode = -1;
});
// 'SGITERM' means process was terminated gracefully
process.once('SIGTERM', (code)=>{
console.log('SIGTERM exit code : ', code);
});
throw new Error('κΈ°λͺ¨λ¦¬');
π€ μ μ½λλλ‘νλ©΄ process.exit μ΄λ²€νΈ 리μ€λκ° λμνμ§ μλλ€. (λ‘κΉ X)
uncaughtException μμ λ‘κΉ μμ΄ λ°λ‘ νλ‘μΈμ€ μ’ λ£
μ λ‘κΉ μ΄ μλκ³ λλ κΉ?
λͺ¨λ μ΄λ²€νΈκ° λ±λ‘λκΈ° μ μ
λ무 κΈνκ² throw νκ±°λ
process λ₯Ό μ’ λ£μμΌ°κΈ° λλ¬Έ.
// 1μ΄ν μ§μ° μ€ν
setTimeout(()=>{
// process.exit(-1);
throw new Error('κΈ°λͺ¨λ¦¬');
}, 1000)
μ΄λ κ²λ§ ν΄λ λ‘κΉ μ΄ μ λλ‘ λλ€.
Ctrl + C (SIGINT) μ΄λ²€νΈ κ°μ§λ?
$ process.on('SIGINT')
μ μμ μμ Ctrl + C ν€λ₯Ό λλ¬ SIGINT μκ·Έλμ μ μ‘ν λλ process.exit μ΄λ²€νΈ 리μ€λκ° λμνμ§ μλλ€.
λμ λ€μκ³Ό κ°μ μ½λλ‘ μ‘μλΌ μ μλ€.
process.on('exit', (code)=>{
console.log(`exit code : ${code}`);
// exit code κ° 0μ΄ μλ λλ§ μΆκ° λ‘κΉ
if(code !== 0) {
logger.error({
exitCode: code,
message: "I'm gone",
timestamp: new Date(),
});
}
});
// log κ° μ°νκ³
// λ³λλ‘ process.exit(0) κ³Ό κ°μ μ½λλ₯Ό μΆκ°νμ§ μμλ.
// process.exitCode κ° 0μΌλ‘ μ’
λ£λλ€.
process.once('SIGINT', ()=>{
console.log("You've pressed Ctrl + C on this process.");
})
// Print:
// exit code: 0
π Reference
'Web > Nodejs' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
node_modules μ package.json (0) | 2021.12.08 |
---|---|
[Node.js] λ‘컬μ μ€μΉλ ν¨ν€μ§ λͺ λ Ήμ΄(CLI)λ‘ μ€ννκΈ° (0) | 2021.07.27 |
[Typescript] Creating Custom Types (0) | 2021.06.21 |
imagemagick module PDF->png κΆν μ€μ Error (0) | 2020.02.06 |
Error: Cannot find module (0) | 2020.01.15 |