プロセスマネージャー
プロセスマネージャーとは
プロセスマネージャー(Process Manager)とは、アプリケーションのプロセスを起動し、実行中の状態を管理するソフトウェアです。
サーバー上でアプリケーションを常時稼働させる場合、単に node server.js や java -jar app.jar を実行するだけでは、ターミナルを閉じたときやプロセスが異常終了したときにサービスが停止します。プロセスマネージャーは、このようなプロセスの起動後に必要となる管理を担います。
何を管理するのか
プロセスマネージャーは、主に次のような処理を行います。
- アプリケーションプロセスの起動と停止
- プロセスの異常終了やクラッシュの検知
- 異常終了したプロセスの再起動
- プロセスをバックグラウンドで実行すること
- 標準出力や標準エラー出力のログ管理
- プロセスごとの環境変数や起動引数の管理
- 複数プロセスの状態確認
これらによって、アプリケーションを手動で起動し続けたり、障害のたびに再起動したりする運用を減らせます。
OSのプロセスマネージャーとの違い
「プロセスマネージャー」という言葉は、文脈によって二つの意味で使われます。
OSの機能としてのプロセスマネージャー
OSのカーネルには、プロセスを作成し、CPUやメモリなどの資源を割り当て、実行順序を決め、終了させる仕組みがあります。これはOSの内部機能です。
プロセスの状態を管理することや、CPUをどのプロセスに割り当てるかを決めることが主な役割であり、アプリケーションのログ管理やクラッシュ後の再起動を目的としたものではありません。
サーバー運用ツールとしてのプロセスマネージャー
PM2やsystemdのようなツールは、OS上で動作するアプリケーションをサービスとして管理します。
OSのプロセスマネージャーが「プロセスを動かすための基盤」だとすると、サーバー運用ツールとしてのプロセスマネージャーは「特定のアプリケーションを継続的に動かすための管理者」です。
なぜ使うのか
バックグラウンドで実行する
SSHなどでサーバーに接続してアプリケーションを起動した場合、起動したシェルや端末にプロセスが依存することがあります。プロセスマネージャーを使うと、ログアウト後もアプリケーションを動かし続けられます。
異常終了から復旧する
アプリケーションは、予期しない例外、メモリ不足、外部サービスとの通信障害などによって終了することがあります。プロセスマネージャーに再起動の設定をしておけば、プロセスの終了を検知して再起動できます。
ただし、再起動を繰り返すだけでは根本的な障害は解決しません。再起動回数の制限やログ・メトリクスの監視も必要です。
起動方法を標準化する
起動コマンド、環境変数、実行ユーザー、作業ディレクトリ、再起動条件などを設定ファイルで管理できます。担当者が変わっても同じ方法でアプリケーションを起動しやすくなります。
複数のプロセスを管理する
Webアプリケーション、ワーカー、定期実行処理など、複数のプロセスを同じサーバー上で動かすことがあります。プロセスマネージャーを使うと、プロセスごとの状態確認や一括した操作ができます。
代表的なプロセスマネージャー
| ツール | 主な用途 |
|---|---|
| systemd | Linuxのサービスとして、OSの起動・停止と連携して管理する |
| PM2 | Node.jsアプリケーションを起動、監視、再起動する |
| Supervisor | 複数のバックグラウンドプロセスを設定ファイルで管理する |
| Docker Compose | 複数のコンテナをサービス単位で起動・停止する |
| Kubernetes | コンテナをクラスタ上でスケジューリングし、状態を維持する |
これらは似た機能を持ちますが、管理する対象と責任範囲が異なります。systemdはホスト上のサービス管理に向き、PM2はNode.jsアプリケーションの管理に向いています。Docker ComposeやKubernetesは、プロセスそのものよりもコンテナのライフサイクルや配置を管理します。
使い分けの考え方
プロセスマネージャーを選ぶときは、次の点を確認します。
- アプリケーションをホスト上で直接実行するのか、コンテナで実行するのか
- 1台のサーバーだけを管理するのか、複数台を管理するのか
- OS起動時の自動起動が必要か
- クラッシュ時の再起動や終了時の猶予時間を設定したいか
- ログをどこへ出力し、どの仕組みで監視するか
- CPUやメモリの制限、権限分離が必要か
単一サーバー上でNode.jsアプリケーションを動かすならPM2やsystemdが候補になります。Linuxの標準的なサービス管理に寄せたい場合はsystemd、Node.js固有のプロセス管理やクラスターモードを使いたい場合はPM2が候補です。
使わない構成
マネージドな実行環境では、プロセスマネージャーの役割をプラットフォームが担うことがあります。
- AWS Lambdaなどのサーバーレスでは、関数の実行やスケーリングをクラウド側が管理する
- Kubernetesでは、コンテナの再起動や配置をKubernetesが管理する
- PaaSでは、アプリケーションの起動やプロセス監視をPaaSが管理する
このような環境でホスト上のプロセスマネージャーを重ねて導入すると、責任範囲が不明確になったり、二重に再起動を行ったりする可能性があります。実行環境がどこまでプロセス管理を担うのかを確認してから導入します。