2016-09-13 3 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);を追加して、必要なときにスクリプトが終了することを確認します。

このような場合、1行の要約を残してから終了することができます。特定のイベントを聞き取り、到着したら終了することができます。たとえば、次のように適切な場所でprocess.exitに加えて

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

、あなたはまた、一定時間後にスクリプトを終了するためにタイムアウトを設定することができます。たとえば、

setTimeout(process.exit, 20*1000); 

は20秒後にスクリプトを終了します。これは、ちょっとしたことがデータベースや接続に間違っていて、「終了」イベントを得ることができない場合や、それを待つのに時間がかかりすぎる場合に備えて、追加することができます。

このようなスクリプトにprocess.exit(0);を追加すると、その時点で開いている可能性のあるデータベース接続をすべて閉じることや、スクリプトの終了を妨げる可能性があるその他のものよりも便利です。

+0

本当にいいですか?私がこれを正しく理解していれば、 'process.exit(0)'を使うと; 'console.log(doc)'の後に、最初のdocしか取得せず、次にスクリプトをkillするでしょうか? – Kunok

+0

@Kunokあなたは正しいです。私はあなたのスクリプトを注意深く読まなかった。スクリプトを実行する必要があるときに 'process.exit(0);'を追加する必要があります。 – rsp

+0

私はNodeを1週間だけ使用していますが、まだそれほど快適ではありません。スクリプトを強制終了するようにタイムアウトを設定するのは良い考えですか?たとえば、スクリプトが10分ごとに実行された場合、新しいCRONジョブ実行の前にそれを死に至らせますか? – Kunok

関連する問題