2016-10-11 1 views
1

私のsails.jsアプリはPM2の下で動作しています。私はPM2がクラッシュした場合にアプリケーションを再起動できるようにしたいと思います。問題は、セイルがフックをロードできない場合、たとえば起動時にDBが使用できない場合、礼儀正しくsails.lower()がセイルによって内部的に呼び出されますが、実際のノードプロセスは終了しません(process.exit()は、 )コアセイルコードによって。これは、帆がシャットダウンしたことを知らないPM2の結果であり、したがって、それを再び開始することはない。帆がprocess.exitなしで低下する - 機能または間違い?

これはすべて、アプリケーションの初期ブートストラップ時に発生し、私のコードが呼び出される前であるため、私はそれを制御できません。

誰も私がこれをどのように解決できるかについての提案はありますか?

sail.on('lowered', fn)にフックできるカスタムのコアフックを書いて、そのイベントの受信時にprocess.exit()を呼び出すと思っています。アイデア?

多くのありがとうございます。

答えて

1

帆はセイルアプリは(sails.lift()またはsails.lower()経由)プログラムによって起動された可能性がありますので、それが低下するとprocess.exitを呼び出すことはありませんし、このようにプロセスを終了することも同様帆と呼ばれることにスクリプトを終了します。

実際、ノードスクリプトはイベントループに何も残っていないときに自動的に終了するはずです。あなたはsails newで新しい帆アプリを作成し、同様にそのディレクトリにテストスクリプトを作成することで、この自分自身を確認することができます。

/* testscript.js */ 
var Sails = require('sails'); 
Sails.load({hooks: {grunt: false, views: false}}, function(err) { 
    console.log('lifted sails!'); 
    Sails.lower(function(err) { 
     console.log('lowered sails!'); 
    }); 
}); 

コマンドラインでnode testscript.jsを行うと、あなたは2件のログが表示されますし、コマンドプロンプト

これは、アプリがでない場合、が低下していることを実証するためのものです。最も可能性の高いものはデータベースアダプタです。いくつかのアダプタ(Postgresのようなもの)はしばらくの間TCP接続を維持します。 30秒ほど待つと、プロセスが自動的に終了することがあります。 30秒が長すぎて待つことができず、でない場合は、セイルをプログラムで呼び出す場合は、確かにprocess.exitに電話することができます。あなたはlowerイベントを待機した後、帆を最初にクリーンアップするために少しの時間を与えることができます:

sails.on('lower', function() { 
    // Give Sails five seconds to shut down before pulling the plug. 
    setTimeout(
     function() { process.exit(1); }, 
     5000 
    ); 
}); 

あなたconfig/bootstrap.jsにそれを入れて、あなたが行くように良いことがあります。

あなたのプロセスに実際に何が掛かっているのかを確認し、すぐに終了しないようにするには、優秀なwhy-is-node-runningモジュールを試してみてください。

注:この投稿の時点で、lowerイベントが誤ってloweredとしてSailsjs.comに記載されています。これはできるだけ早く修正されます。

+0

sgress454 @リプライのための多くのおかげで、これは多くの意味になります。私は実際に私が必要としていることを達成するためにフックを書いていましたが、基本的にあなたが提案したものですが、ORMフックが失敗している(DBがオフラインの場合など)、bootstrap.jsコードは実行されません。 – dandanknight

2

私は必要なものを達成するためにフックを書き終えました。フックはsails.on('lower')(ドキュメントが言うように「下げられていません」)を待ち受け、設定可能な時刻を待ち、設定可能な終了コードを使用してprocess.exit()を呼び出します。

誰がそれを必要とする場合は、follwoing api/hooks/exitOnLower.jsファイルを作成...

module.exports = function (sails) { 

    return { 
     defaults: { 
      __configKey__: { 
       name : 'exitOnlower', 
       wait : 10000, 
       active: true, 
       // exitCode : 2 
      } 
     }, 

     initialize: function (cb) { 

      var active = sails.config[this.configKey].active; 
      var timeout = sails.config[this.configKey].wait; 
      var exitCode = sails.config[this.configKey].exitCode; 

      if (!active) { 
       return cb(); 
      } 

      sails.on('lower', function() { 
       sails.log.verbose("[hook:killOnLower] Sails lower detected, exiting in %sms...", timeout); 
       setTimeout(function() { 
        sails.log.warn("[hook:killOnLower] exiting app"); 
        process.exit(exitCode ? exitCode : null); 
       }, timeout) 
      }); 

      return cb(); 
     } 
    }; 
}; 
+0

私はまったく同じ問題を抱えていましたが、これは魅力的でした! – tkarls

関連する問題