nodejs 스크립트가 정상적으로 실행된 후 자동으로 종료되지 않음
db 테이블과 solr의 데이터를 읽고 db 테이블을 업데이트하기 위한 스크립트를 작성했습니다.비동기 사용 중입니다.워터폴 모듈문제는 모든 작업이 정상적으로 완료된 후에도 스크립트가 종료되지 않는다는 것입니다.db connection pool을 사용한 적이 있습니다.그것은, 무한히 대기하는 스크립트를 작성하는 것이 아닐까 생각하고 있습니다.이 스크립트를 crontab에 넣고 싶은데 제대로 종료되지 않으면 불필요하게 많은 인스턴스가 생성됩니다.
방금 이 문제를 검토했어요.
사용하는 것만으로 문제가 발생하다process.exit()
제가 작업하고 있는 프로그램은 핸들을 만드는 것이었지만 절대 파괴하지는 않았습니다.
그것은 디렉토리를 처리하고 데이터를 orientdb에 넣고 있었다.
그래서 알게 된 몇 가지 사실은 참조를 삭제하기 전에 데이터베이스 연결을 닫아야 한다는 것입니다.그리고 그거process.exit()
모든 케이스가 해결되는 것은 아닙니다.
내 프로젝트가 2,000개의 파일을 처리했을 때.500개 정도 남았을 것이고, 여분의 핸들이 사용 가능한 작업 메모리를 가득 채웠을 것입니다.그 말은 즉, 계속 할 수 없다는 거죠.그 때문에, 이 데이터에는 이르지 않습니다.process.exit
마지막에.
한편, 앱의 오픈을 요구하는 아이템을 닫으면, 문제의 근원을 해결할 수 있습니다.
제가 사용할 수 있었던 두 가지 "문서화되어 있지 않은 기능"은
process._getActiveHandles();
process._getActiveRequests();
이러한 유형의 문제를 디버깅하는 데 다른 기능이 도움이 될지는 모르겠지만, 이러한 기능은 훌륭했습니다.
어레이가 반환되므로 이러한 방법을 사용하여 프로세스에서 어떤 일이 일어나고 있는지 많은 것을 확인할 수 있습니다.
난 그저 그게 이 게시물을 우연히 건너는 다른 사람에게 도움이 되길 바랄 뿐이야.
끝나면 전화로 알려줘야 해
process.exit();
구체적으로는 비동기로부터의 콜백으로 호출할 수 있습니다.waterpol() (그 함수의 두 번째 인수).이 시점에서 모든 비동기 코드가 실행되며 스크립트를 종료할 준비가 됩니다.
편집: 아래 @Aaron에서 지적한 바와 같이 이는 데이터베이스 연결이 활성화되어 노드 프로세스가 종료되지 않는 것과 관련이 있을 수 있습니다.
노드 모듈 why-is-node-running 을 사용할 수 있습니다.
실행합니다.
npm install -D why-is-node-running
import * as log from 'why-is-node-running';
의 코드로프로그램이 종료될 것으로 예상되는 경우 로그 문을 추가합니다.
afterAll(async () => {
await app.close();
log();
})
그러면 열려 있는 핸들의 목록이 스택 트레이스와 함께 인쇄되어 어디서 발생했는지 알 수 있습니다.
There are 5 handle(s) keeping the process running
# Timeout
/home/maf/dev/node_modules/why-is-node-running/example.js:6 - setInterval(function () {}, 1000)
/home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()
# TCPSERVERWRAP
/home/maf/dev/node_modules/why-is-node-running/example.js:7 - server.listen(0)
/home/maf/dev/node_modules/why-is-node-running/example.js:10 - createServer()
다음을 사용하여 실행을 종료할 수 있습니다.
connection.destroy();
Visual Studio 코드를 사용하는 경우 이미 실행 중인 노드 스크립트에 직접 연결할 수 있습니다.
먼저 Debug를 실행합니다. 노드 프로세스 명령에 연결됨:
명령어를 호출하면 VS 코드는 다음 Node.js 프로세스에 연결할 것인지 묻는 메시지를 표시합니다.
단말기에 다음 메시지가 표시됩니다.
Debugger listening on ws://127.0.0.1:9229/<...>
For help, see: https://nodejs.org/en/docs/inspector
Debugger attached.
그런 다음 디버깅콘솔 내에서 The Lazy Coder의 답변에 있는 코드를 사용할 수 있습니다.
process._getActiveHandles();
process._getActiveRequests();
언급URL : https://stackoverflow.com/questions/21831493/my-nodejs-script-is-not-exiting-on-its-own-after-successful-execution
'sourcecode' 카테고리의 다른 글
WHERE 절의 필드 순서가 MySQL의 성능에 영향을 미칩니까? (0) | 2022.09.19 |
---|---|
Larabel에서 검증 오류/예외를 수동으로 반환하거나 슬로우하려면 어떻게 해야 합니까? (0) | 2022.09.19 |
PHP에서 이메일 주소를 확인하는 방법 (0) | 2022.09.19 |
PHP: 이미지 파일이 있는지 확인하는 방법 (0) | 2022.09.19 |
MySQL ON 중복 키 - 마지막 삽입 ID? (0) | 2022.09.18 |