2016-11-13 5 views
6

프로세스가 종료되기 전에 비동기 작업을 수행하려고했습니다. 종료시 비동기 작업 수행 방법

에 ..

  • ctrl+c
  • catch되지 않은 예외
  • 충돌 코드
  • 아무것도의
  • 종료 : 말하는

    내가 종단의 모든 가능성을 의미하는 '종료' 내 지식은 exit 이벤트는 동기 작업을 위해이를 수행합니다.

    'beforeExit'이벤트

    이 같은 process.exit() 또는 캐치되지 않는 예외를 호출로, 명시 적 종료를 일으키는 조건을 방출되지 않습니다

    Nodejs의 문서를 읽기

    내가는 beforeExit 이벤트가하지만 비동기 작업입니다 발견했다.

    'beforeExit'는 추가 작업 일정을 계획하지 않는 한 'exit'이벤트의 대안으로 사용하면 안됩니다.

    의견이 있으십니까?

+1

모든 코드를 별도의 파일 (예 : afterExit.js)에 넣고 exit 이벤트가 발생하면 'require ('child_process '). exec ('node afterExit.js ');'를 실행하는 것이 좋습니다. 생각했지만 – Molda

+0

@Molda 헤이 또, 나는 잠시 동안 그 문제를 떠났고, 지금은 일하고, 외부 스크립트를 사용하여 당신이 쉬운 해결책이 될 것이라고 제안한 것처럼 실행하겠다고 생각했다. 그러나 나는 어떤 방법을 오해하는지에 대해 오해했다. 해당 스크립트의 변수는 'afterExit'코드가 부모의 상태에 따라 다르므로 어떤 도움이라도 대단히 감사하겠습니다! –

+0

일부 변수를 매개 변수로 전달할 수 있습니다. exec ('node afterExit.js some_param some_other_param'); 그리고'process.args'를 사용하여 액세스하거나 필요한 데이터가있는 json 파일을 만들고 해당 파일의 경로를 스크립트에 전달하고 afterExit에서 해당 파일을로드하십시오.js – Molda

답변

4

종료하기 전에 신호를 트랩하고 비동기 작업을 수행 할 수 있습니다.

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()는 닫기 이벤트 만 내보내고 서버가 종료했는지 여부에 관계없이 이벤트 루프가 계속 처리합니다.
+0

안녕 벤, 당신의 대답에 감사드립니다. 이 코드에 대해 더 설명해 주시겠습니까? 익숙한 시그널은'SIGINT'와'exit'입니다. 다른 시그널은 무엇입니까? 또한'sig'가'string'인지 검사하는 이유는 무엇입니까? 'db.close'가 비동기라고 가정하면 거기서 끝나지 않을 것입니까? –