forever で minUptime と spinSleepTime の警告が消えない
◆ チェック対象がコマンドライン引数で JSON の方は見てない
◆ JSON で設定しても毎回警告が出る
◆ 設定自体は有効なので無視でいい
◆ 機能の使いみちは
◆ 起動時間が minUptime み満たずに終了した場合に
◆ 再起動まで spinSleepTime だけ待つ
◆ JSON で設定しても毎回警告が出る
◆ 設定自体は有効なので無視でいい
◆ 機能の使いみちは
◆ 起動時間が minUptime み満たずに終了した場合に
◆ 再起動まで spinSleepTime だけ待つ
警告は出るけど設定されてる
forever で特に設定をしなければwarn: --minUptime not set. Defaulting to: 1000ms
warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
というメッセージが出ます
このメッセージは minUptime と spinSleepTime が未設定というものです
これを JSON で設定しても消えません
原因はチェック対象が JSON ではないコマンドラインの方だからです
https://github.com/foreversd/forever/blob/1.0.0/lib/forever/cli.js#L266-L277
ここで options.minUptime と options.spinSleepTime をチェックしてますが options はコマンドライン引数をパースしたものが入っています
JSON をパースしたものは configs の方に入ってます
なので 警告出したりデフォルト値を設定したりしていますが JSON 設定を使ってると関係ありません
その後 options と configs のそれぞれをマージしていますが configs のほうが優先なのでちゃんと JSON の設定が使われます
特に問題が出るわけでもないですが forever もこういう細かなバグがいくつかあります
minUptime と spinSpeepTime
この設定が一体なんなのかわかるようでわかってなかったので使用箇所を見てみました使用箇所はここです
https://github.com/foreversd/forever-monitor/blob/1.7.1/lib/forever-monitor/monitor.js#L212
モニタプロセスが子プロセス(forever で起動する JavaScript ファイル)の再起動を setTimeout で遅らせてます
これは spinning が true のときでそうでないなら即時再起動です
spinning は終了までの起動時間が minUptime より短い場合に true です
https://github.com/foreversd/forever-monitor/blob/1.7.1/lib/forever-monitor/monitor.js#L188
この機能の使いみちは シンタックスエラーや起動時の外部サーバへの接続など 起動してからすぐにエラーが起きて終了した場合に高速で再起動を繰り返さないようにできるというものです
最大再起動回数がないとエラーログがすごいことになってしまいますからね
起動から 5 秒以内に終了した場合は 3 秒あけてから再起動となれば 大量のエラーの繰り返しになるのを防げます
また 接続エラーなら数秒すれば回復してる場合もあると思うので それまでの無駄な再接続チェック回数を減らすことにもなります
反対に何時間も起動してるものなら 想定外のリクエストを受けたときなど特定の処理や条件が原因でエラーがあることがほとんどなので すぐ再起動してくれるほうが助かります
STOPPED
この機能は再起動までの時間だけで コード的にも他に関係しそうにないのですが minUptime と spinSleepTime を設定すると stop コマンドで止められなくなりましたstop 命令を実行すると普段はすぐに終わるのですが しばらく待っても forever コマンドが終了しません
Ctrl-C で無理やり終了してから status を見ると uptime に STOPPED という見慣れないものが表示されていました
これまでは stop を実行するとモニタプロセスごと終了するので uptime に STOPPED と出るのではなく行が出てませんでした