systemd
Linux init system と サービスマネージャ
systemdとは
systemdは、Linux のシステムとサービスを管理するマネージャです。 従来のSysV initを置き換え、並列起動、依存関係管理、cgroups統合などを提供します。
ユニットファイル
ユニットファイルはサービスの定義ファイル。 INIファイル形式で記述します。
/etc/systemd/system/管理者が作成するユニット(優先度高)
/usr/lib/systemd/system/パッケージがインストールするユニット
/run/systemd/system/ランタイム生成ユニット
1 # /etc/systemd/system/myapp.service 2 [Unit] 3 Description=My Application 4 After=network.target 5 Wants=network-online.target 6 7 [Service] 8 Type=simple 9 User=myapp 10 Group=myapp 11 WorkingDirectory=/opt/myapp 12 ExecStart=/opt/myapp/bin/myapp 13 ExecReload=/bin/kill -HUP $MAINPID 14 Restart=always 15 RestartSec=10 16 17 # リソース制限 18 MemoryLimit=512M 19 CPUQuota=50% 20 21 # セキュリティ 22 NoNewPrivileges=true 23 PrivateTmp=true 24 25 [Install] 26 WantedBy=multi-user.target
ユニットファイルの構造
[Unit] セクション
- •
Description: 説明 - •
After: このユニットの後に起動 - •
Before: このユニットの前に起動 - •
Wants: 弱い依存関係 - •
Requires: 強い依存関係
[Service] セクション
- •
Type: simple, forking, oneshot, notify - •
ExecStart: 起動コマンド - •
ExecStop: 停止コマンド - •
ExecReload: リロードコマンド - •
Restart: no, always, on-failure - •
RestartSec: 再起動間隔
[Install] セクション
- •
WantedBy: enableで有効化されるターゲット - •
RequiredBy: 必須で有効化されるターゲット - •
Alias: 別名
サービスタイプ
simple
プロセスがフォアグラウンドで実行。デフォルト。
forking
デーモン化してバックグラウンドに移行。PIDファイル指定推奨。
oneshot
一度実行して終了。RemainAfterExit=trueと組み合わせ。
notify
サービスがsd_notify()で起動完了を通知。
タイマー(cron代替)
1 # /etc/systemd/system/backup.timer 2 [Unit] 3 Description=Daily Backup Timer 4 5 [Timer] 6 OnCalendar=daily 7 # または OnCalendar=*-*-* 02:00:00 8 Persistent=true 9 10 [Install] 11 WantedBy=timers.target 12 13 # /etc/systemd/system/backup.service 14 [Unit] 15 Description=Backup Service 16 17 [Service] 18 Type=oneshot 19 ExecStart=/opt/scripts/backup.sh
1 # タイマー操作 2 systemctl enable backup.timer 3 systemctl start backup.timer 4 systemctl list-timers
管理コマンド
1 # ユニットファイル変更後 2 systemctl daemon-reload 3 4 # 依存関係確認 5 systemctl list-dependencies nginx 6 systemctl list-dependencies --reverse nginx 7 8 # 失敗したサービス 9 systemctl --failed 10 11 # リソース使用状況 12 systemd-cgtop 13 14 # ブート分析 15 systemd-analyze 16 systemd-analyze blame 17 systemd-analyze critical-chain 18 19 # ユニットファイル確認 20 systemctl cat nginx.service 21 systemctl show nginx.service
SRE/インフラ観点
ベストプラクティス
- •
Restart=alwaysとRestartSecで自動復旧 - •
MemoryLimit/CPUQuotaでリソース制限 - •
PrivateTmp=trueでセキュリティ強化 - •
After=network-online.targetでネットワーク依存を明示
トラブルシューティング
- • 起動失敗:
journalctl -u service -xe - • 設定確認:
systemctl show service - • 起動順序:
systemd-analyze critical-chain