フォーキングデーモンサービス
従来のフォーキングデーモン用のsystemdユニットファイルを設定します。PIDFileの追跡、systemdがforkされたプロセスを監視する方法、forkingサービスタイプを使用するタイミングについて解説します。
Simple Services
詳細な説明
systemdで従来のデーモンを管理する
従来のUnixデーモンは子プロセスをforkして親が終了します。Type=forkingサービスタイプは、systemdにこの動作を期待するよう指示します。systemdは親プロセスが正常に終了した時点でサービスが開始されたと見なします。
[Unit]
Description=Legacy Application Daemon
After=network.target
[Service]
Type=forking
PIDFile=/var/run/myapp.pid
ExecStart=/usr/sbin/myapp --daemon
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
RestartSec=10
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
[Install]
WantedBy=multi-user.target
フォーキングプロセスの理解
Type=forkingが設定されている場合、起動シーケンスは以下のように動作します:
- systemdがExecStart(
/usr/sbin/myapp --daemon)を実行 - アプリケーションが子プロセスをfork
- 親プロセスがコード0で終了
- systemdが
PIDFileから子のPIDを読み取る - systemdが子プロセスを監視
PIDFileは重要
フォーキングサービスでは、PIDFile=が不可欠です。これがないと、systemdはどのプロセスがメインサービスプロセスかを見失う可能性があります。アプリケーションはフォーキングプロセス中に子のPIDをこのファイルに書き込む必要があります。
フォーキングサービスでよくある問題
- PIDFileの欠如: systemdがforkの成功を確認できないため、サービスが「activating」のまま永遠に表示される。
- ダブルフォーキング: 一部のデーモンは二重にforkします。最終PIDが正しく書き込まれていればsystemdはこれを処理できます。
- PIDの再利用: PIDFileに古いPIDが含まれている場合、systemdが間違ったプロセスを監視する可能性があります。
フォーキングを避けるべき場面
ほとんどの最新アプリケーションはフォアグラウンドでの実行をサポートしています。可能な限りType=simpleを選択してください。理由:
- PIDFile管理の複雑さがない
- よりシンプルなプロセス追跡
- より高速な起動検出
- cgroupsとリソース制御とのより良い互換性
ユースケース
fork()を使用して自身をデーモン化するように設計されたレガシーC/C++デーモン(Apache httpdの古いバージョン、MySQL、フォアグラウンドモードをサポートしないカスタム社内デーモンなど)を実行する場合に使用します。