再起動戦略

再起動戦略

PM2でアプリケーションを起動すると、アプリケーションは自動終了時、イベントループが空になった場合(node.js)、またはアプリケーションがクラッシュした場合に自動的に再起動されます。ただし、以下のような追加の再起動戦略を設定することもできます。

  • 指定されたCRON時間でアプリを再起動する
  • ファイルが変更されたときにアプリを再起動する
  • アプリがメモリしきい値に達したときに再起動する
  • 起動と自動再起動を遅延させる
  • 自動再起動を無効にする(デフォルトでは、アプリはクラッシュまたは終了時にPM2で常に再起動されます)
  • 特定の指数関数的に増加する時間でアプリケーションを自動的に再起動する

CRON時間で再起動する

CLI経由

$ pm2 start app.js --cron-restart="0 0 * * *"
# Or when restarting an app
$ 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

ファイル変更時に再起動する

PM2は、カレントディレクトリまたはそのサブディレクトリ内のファイルが変更されたときに、アプリケーションを自動的に再起動できます。

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",
  // Specify which folder to watch
  watch: ["server", "client"],
  // Specify delay between watch interval
  watch_delay: 1000,
  // Specify which folder to ignore 
  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'
}

注:単位はK(キロバイト)(例:512K)、M(メガバイト)(例:128M)、G(ギガバイト)(例:1G)です。

再起動遅延

再起動遅延戦略を使用して、自動再起動の間に遅延を設定します

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)にはプロセス マネージャーに再起動させたくない場合があります。

この場合でも、stop_exit_codesオプションを自動再起動をスキップする終了コードに設定することで、PM2を問題なく使用できます

CLI

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

または、設定ファイル経由では、stop_exit_codes属性を使用します

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

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

PM2ランタイムに新しい再起動モードが実装され、アプリケーションの再起動がよりスマートになりました。例外が発生した場合(例:データベースがダウンしている場合)にアプリケーションを狂ったように再起動する代わりに、*指数バックオフ再起動*は再起動の間隔を徐々に増やし、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オプションが有効になっている場合、新しいアプリケーションステータス**再起動待ち**が表示されます。

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

ご覧のとおり、再起動間の再起動遅延は、再起動間の最大15000msに達するまで、指数移動平均で増加します。

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

このページに貢献する