Ubuntu 26.04 講座 / Ubuntuでサービスの設定を安全に変更する

サービス設定は、元の設定と現在適用されている値を記録し、別の変更ファイルを作成した後、構文チェック・適用・実際の応答確認の順で変更します。systemdの unit 変更、アプリ設定の再読み込み、プロセス再起動は別の作業です。

元の unit と drop-in を探す

実際のサービス名を確認した後、systemctl cat サービス名 と systemctl show サービス名 -p FragmentPath -p DropInPaths で出典を確認します。パッケージの /usr/lib/systemd/system 元の設定を直接修正すると、アップデートで上書きされる可能性があるため、ローカル変更は /etc/systemd/system の drop-in に分けます。

独立した実習サービスを作る

以下は、サーバーアプリに影響を与えない専用VMでの実習です。ubuntu-course-lab.service が既に存在する場合は別の名前を設定し、パス・コマンド全体を合わせます。noclobber 設定は既存ファイルの上書きを防ぎ、作成に失敗すると次のステップに進みません。

(
set -eu
sudo sh -c 'set -C; cat > /etc/systemd/system/ubuntu-course-lab.service' <<'EOF'
[Unit]
Description=Ubuntu course configuration lab

[Service]
Type=oneshot
Environment=LAB_MODE=baseline
ExecStart=/usr/bin/printenv LAB_MODE
EOF
sudo systemd-analyze verify /etc/systemd/system/ubuntu-course-lab.service
sudo systemctl daemon-reload
sudo systemctl start ubuntu-course-lab.service
journalctl -u ubuntu-course-lab.service --since '5 minutes ago' --no-pager
)

ログに baseline が表示され、実行結果が成功か確認します。Type=oneshot サービスは作業後 inactive に見える場合があるため、inactive そのものを失敗と判断しません。systemctl show ubuntu-course-lab.service -p Result で結果も確認します。

drop-in 一つで値を変更する

(
set -eu
sudo mkdir -p /etc/systemd/system/ubuntu-course-lab.service.d
sudo sh -c 'set -C; cat > /etc/systemd/system/ubuntu-course-lab.service.d/10-lab.conf' <<'EOF'
[Service]
Environment=LAB_MODE=changed
EOF
sudo systemd-analyze verify /etc/systemd/system/ubuntu-course-lab.service
sudo systemctl daemon-reload
sudo systemctl start ubuntu-course-lab.service
journalctl -u ubuntu-course-lab.service --since '5 minutes ago' --no-pager
)

元の unit の環境値はそのままにして、drop-in で changed を適用します。merged 設定と新しい実行ログを比較します。検証ツールが成功しても、アプリごとの設定文法や実際のファイルアクセス・ポート応答まで全て確認したわけではありません。

3つの再読み込み動作を区別する

コマンド 役割
systemctl daemon-reload unit・依存関係の定義を systemd が再読み込みする
systemctl reload サービス アプリがサポートする設定 reload を実行
systemctl restart サービス プロセスを停止してから再起動する

例えば Nginx アプリ設定は nginx -t で確認し、サポートされている reload を検討します。unit の環境値を変えた場合、daemon-reload のみでは既存プロセスの環境は変わりません。中断の影響と新しい接続試験を計画して適用方法を決めます。

systemd.unit のドキュメントは、ユニットの検索パスとドロップインの優先順位について説明しています。

今回の変更だけを復元する

(
set -eu
sudo rm -- /etc/systemd/system/ubuntu-course-lab.service.d/10-lab.conf
sudo systemctl daemon-reload
sudo systemctl start ubuntu-course-lab.service
journalctl -u ubuntu-course-lab.service --since '5 minutes ago' --no-pager
)

再びベースラインが出力されるか確認します。この rm は今回作成した専用の実習用ドロップインだけを削除します。systemctl revertでまとめて戻し、他の管理者の変更まで消さないでください。実習用ユニットも整理する場合は、そのファイルが今回作成したものか確認し、実行中でないことを確認した上で、そのファイルだけを削除し、daemon-reload します。