🙆

PM2リスタート戦略まとめ

に公開

PM2でアプリを起動すると、自動終了時やイベントループが空になった時(Node.js)、またはアプリがクラッシュした時は自動的に再起動されますが、それ以外にもリスタート戦略について色々オプションがあったので、備忘録として記録しておきます。

目次

指定したCRON時間に再起動

CLI経由:

$ pm2 start app.js --cron-restart="0 0 * * *"
# すでに起動済みのアプリを再起動する場合
$ pm2 restart app --cron-restart="0 0 * * *"

設定ファイル経由:

cron_restart属性を使用:

module.exports = {
  apps : [{
    name: 'Business News Watcher',
    script: 'app.js',
    instances: 1,
    cron_restart: '0 0 * * *',
    env: {
      NODE_ENV: 'development'
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }]
}

CRON再起動を無効化:

$ pm2 restart app --cron-restart 0

ファイル変更時に再起動

CLI経由:

$ pm2 start app.js --watch

注意: --watchオプション付きでアプリを起動した場合、アプリを停止してもファイル変更時の再起動は防げない。監視機能を完全に無効にするには、pm2 stop app --watchを実行するか、pm2 restart app --watchでアプリ再起動時に監視オプションを切り替える必要がある。

設定ファイル経由:

watch: true属性を使用:

module.exports = {
  script: "app.js",
  watch: true
}

どのフォルダを監視するか、無視するフォルダ、監視間隔なども指定できる:

module.exports = {
  script: "app.js",
  // 監視するフォルダを指定
  watch: ["server", "client"],
  // 監視間隔の遅延を指定
  watch_delay: 1000,
  // 無視するフォルダを指定
  ignore_watch : ["node_modules", "client/img"],
}

メモリ閾値に達した時に再起動

PM2では、メモリ制限に基づいてアプリケーションをリロード(クラスタでなければ再起動にフォールバック)できる。PM2の内部ワーカー(メモリをチェックする)は30秒ごとに起動するので、メモリしきい値に達した後、プロセスが自動的に再起動されるまで少し待つ必要があるかもしれません。

CLI経由:

$ pm2 start api.js --max-memory-restart 300M

設定ファイル経由:

max_memory_restart属性を使用:

module.exports = {
  script: 'api.js',
  max_memory_restart: '300M'
}

再起動の遅延設定

再起動の遅延戦略を使って、自動再起動の間に遅延を設定できる:

CLI経由:

$ pm2 start app.js --restart-delay=3000

設定ファイル経由:

restart_delay属性を使用:

module.exports = {
  script: 'app.js',
  restart_delay: 3000
}

自動再起動の無効化

あまり使わないかもですが、1回限りのスクリプトを実行し、実行が完了した場合にプロセスマネージャーがスクリプトを再起動しないようにしたい場合に便利。

CLI経由:

$ pm2 start app.js --no-autorestart

設定ファイル経由:

autorestart属性を使用:

module.exports = {
  script: 'app.js',
  autorestart: false
}

特定の終了コードで自動再起動をスキップ

失敗時(つまり、0以外の終了コード)にはアプリケーションを自動的に再起動させたいが、適切にシャットダウンした場合(つまり、終了コードが0の場合)にはプロセスマネージャーに再起動させたくない場合は、自動再起動をスキップすべき終了コードをstop_exit_codesオプションで設定できる:

CLI経由:

$ pm2 start app.js --stop-exit-codes 0

設定ファイル経由:

stop_exit_codes属性を使用:

module.exports = [{
  script: 'app.js',
  stop_exit_codes: [0]
}]

指数バックオフ再起動遅延

例外が発生したとき(データベースがダウンしているなど)に、アプリを強制的に再起動する代わりに、指数バックオフ再起動は再起動間の時間を徐々に増やし、DBや外部プロバイダーへの負荷を減らすことができる。

CLI経由:

$ pm2 start app.js --exp-backoff-restart-delay=100

設定ファイル経由:

exp_backoff_restart_delay属性を使用します:

module.exports = {
  script: 'app.js',
  exp_backoff_restart_delay: 100
}

アプリケーションがクラッシュし、--exp-backoff-restart-delayオプションが有効になっている場合、新しいアプリケーションステータス「waiting restart」が表示される。

pm2 logsを実行すると、再起動遅延が増加していることも確認可能:

PM2      | App [throw:0] will restart in 100ms
PM2      | App [throw:0] exited with code [1] via signal [SIGINT]
PM2      | App [throw:0] will restart in 150ms
PM2      | App [throw:0] exited with code [1] via signal [SIGINT]
PM2      | App [throw:0] will restart in 225ms

アプリケーションが安定モード(30秒以上再起動なしのアップタイム)に戻ると、再起動遅延は自動的に0msにリセットされる。

Discussion