フォーキングデーモンサービス

従来のフォーキングデーモン用の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が設定されている場合、起動シーケンスは以下のように動作します:

  1. systemdがExecStart(/usr/sbin/myapp --daemon)を実行
  2. アプリケーションが子プロセスをfork
  3. 親プロセスがコード0で終了
  4. systemdがPIDFileから子のPIDを読み取る
  5. 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、フォアグラウンドモードをサポートしないカスタム社内デーモンなど)を実行する場合に使用します。

試してみる — Systemd Unit File Generator

フルツールを開く