ワンショット起動スクリプト

起動時に初期化スクリプトを実行するためのsystemd oneshotサービスを構築します。RemainAfterExit、Before/Afterによる順序付け、oneshotとsimpleサービスの違いについて学びます。

Simple Services

詳細な説明

systemdでスクリプトを一度だけ実行する

Type=oneshotサービスタイプは、タスクを実行して終了するプロセス用に設計されています。simpleサービスとは異なり、systemdはプロセスが完了するまでサービスが「開始された」と見なしません。

[Unit]
Description=System Initialization Script
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/opt/scripts/initialize.sh
RemainAfterExit=yes
StandardOutput=journal
StandardError=journal
User=root

[Install]
WantedBy=multi-user.target

RemainAfterExit

RemainAfterExit=yesディレクティブはoneshotサービスにとって重要です。これがないと、スクリプト完了後にサービスステータスが「inactive (dead)」と表示され、正常に実行されたかどうか判断しにくくなります。この設定により:

  • スクリプトがコード0で終了した後、サービスは**active (exited)**と表示される
  • このサービスに依存する他のサービスが完了を確認できる
  • systemctl is-active myinit.serviceが「active」を返す

ネットワーク依存関係

network.targetの代わりにnetwork-online.targetを使用していることに注目してください:

  • network.target: ネットワークインターフェースが設定されているが、まだIPを持っていない可能性がある
  • network-online.target: ネットワークが接続性を持って完全に動作している

複数のExecStart行

Oneshotサービスは独自に複数のExecStart=ディレクティブを許可します。順番に実行されます:

[Service]
Type=oneshot
ExecStart=/opt/scripts/step1-setup-dirs.sh
ExecStart=/opt/scripts/step2-download-config.sh
ExecStart=/opt/scripts/step3-apply-migrations.sh

いずれかのステップが失敗(非ゼロ終了)すると、後続のステップはスキップされ、サービスは失敗状態になります。

ユースケース

データベースマイグレーションの実行、必要なディレクトリの作成、リモートソースからの設定のダウンロード、または他のサービスが起動する前に完了する必要がある初期化タスクに使用します。

試してみる — Systemd Unit File Generator

フルツールを開く