2016-09-13 2 views
2

CRON 작업으로 실행되는 Node.js 스크립트를 빌드 중입니다. (전체 터미널 스크립트). 이 스크립트는 API를 사용하여 모든 곳에서 데이터를 가져오고 MongoDB (기본 드라이버)가 사용됩니다. 나는 db.close() 문을 사용하지 않았고, 그 스크립트 자체가 결코 끝나지 않을 것이므로 (적어도 터미널에서 그렇게 보입니다), 끝내려면 CTRL + C를 눌러 취소해야합니다.데이터베이스 연결을 닫지 않고 Node.js 스크립트를 CRON 작업으로 실행하면 결국 모든 RAM이 종료됩니까?

이전에이 스크립트를 작성했을 때 Stack overflow의 누군가가 어쨌든 연결을 종료 할 필요가 없다고 말했습니다. 그래서 나는 그렇게했다.

이제이 스크립트가 실제로 실행되고 있습니까? 그리고 이것들은 작은 간격으로 CRON 작업으로 실행되기 때문에 이러한 스크립트가 결국 서버에서 RAM을 제거하게됩니다. 즉, 수천 개의 스크립트가 실행 중이고 db.close() 성명을 기다리고 있을까요?

예제 코드 :

MongoClient.connect(mongoUrl, (err, db) => { 
    if (err) { 
    console.log(err); 
    return; 
    } 

    var usersCollection = db.collection('users').find(); 

    usersCollection.on('data', (doc) => { 

    console.log(doc); 

    }); 

답변

2

노드 스크립트 출구 자체로는 아무것도 더 이상 이벤트를 수신하지 경우에만 사용할 수 있습니다.

스크립트를 사용하면 스크립트의 주요 목적을 달성 한 후에는 아무 것도 할 필요가 없을 때를 알 수 있습니다. 예를 들어, 스크립트의 목적이 특정 코드를 실행하는 경우 요약 등을 인쇄 한 다음 해당 명령 뒤에 process.exit(0);을 추가하여 필요할 때 스크립트가 완료되도록 할 수 있습니다.

종료 할 수있는 요약 행이 하나도없는 경우 이와 같은 경우 일정한 이벤트를 수신하고 도착하면 종료 할 수 있습니다. 예를 들어 : 정확한 지점에 process.exit 외에도

usersCollection.on('end', process.exit); 

은 또한 특정 시간 이후에 스크립트를 종료 시간 제한을 설정할 수 있습니다. 예 :

setTimeout(process.exit, 20*1000); 

은 20 초 후에 스크립트를 종료합니다. 이것은 somethings가 데이터베이스 나 연결에 문제가 생겨서 '종료'이벤트를 얻지 못하거나 기다릴 시간이 너무 오래 걸리는 경우에 추가 할 수 있습니다.

때로는 process.exit(0);을 이와 같은 스크립트에 추가하는 것은 그 시간에 열려있는 모든 데이터베이스 연결을 닫는 것 또는 스크립트 종료를 방해 할 수있는 다른 것들을 종료하는 것보다 편리 할 수 ​​있습니다.

+0

정말 좋은 생각인가요? 만약 내가 이것을 제대로 이해한다면,'process.exit (0)'을 사용하면; 'console.log (doc)'이후에, 첫번째 doc 만 얻고 스크립트를 죽일 것인가? – Kunok

+0

@Kunok 당신 말이 맞아요. 나는주의 깊게 스크립트를 읽지 않았다. 물론 스크립트가 끝나야 할 때'process.exit (0);'을 추가해야한다. – rsp

+0

Node를 일주일 동안 사용하고 있는데 아직 너무 익숙하지 않아 스크립트를 죽일 시간 제한을 설정하는 것이 좋을까요? 예를 들어 스크립트가 매 10 분마다 실행되면 새로운 CRON 작업 실행 전에 죽게 놔 둡니다. – Kunok

관련 문제