24.5. systemd ユニットファイルを使用した次回ブート時のジョブの実行スケジュール
cron、anacron、at、batch ユーティリティーを使うと、特定の時間に、またはシステム負荷が特定のレベルに達したときに、ジョブを実行するように設定できます。また、次回のシステムブート時に実行するジョブを作成することもできます。これは、実行するスクリプトとその依存関係を指定する systemd
ユニットファイルを作成することで行います。
次回の起動時に実行するスクリプトを設定するには、以下を実行します。
起動プロセスのどの段階でスクリプトを実行するかを指定する
systemd
ユニットファイルを作成します。この例で挙げているのは、Wants=
とAfter=
の合理的な一連の依存関係を備えたユニットファイルです。~]# cat /etc/systemd/system/one-time.service [Unit] # The script needs to execute after: # network interfaces are configured Wants=network-online.target After=network-online.target # all remote filesystems (NFS/_netdev) are mounted After=remote-fs.target # name (DNS) and user resolution from remote databases (AD/LDAP) are available After=nss-user-lookup.target nss-lookup.target # the system clock has synchronized After=time-sync.target [Service] Type=oneshot ExecStart=/usr/local/bin/foobar.sh [Install] WantedBy=multi-user.target
この例を使用すると、以下が可能となります。
-
/usr/local/bin/foobar.sh
を、自分のスクリプトの名前に置き換えます。 必要に応じて
After=
エントリーのセットを変更します。起動プロセスの段階を指定する方法は 「systemd のユニットファイルの作成および変更」 を参照してください。
-
スクリプトの実行後も
systemd
サービスをアクティブに維持したいときは、RemainAfterExit=yes
行を[Service]
セクションに追加します。[Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/foobar.sh
systemd
デーモンをリロードします。~]# systemctl daemon-reload
systemd
サービスを有効にします。~]# systemctl enable one-time.service
以下を実行するスクリプトを作成します。
~]# cat /usr/local/bin/foobar.sh #!/bin/bash touch /root/test_file
スクリプトを次回のブート時のみに実行したいときは、
systemd
ユニットを無効にする行を追加します。#!/bin/bash touch /root/test_file systemctl disable one-time.service
スクリプトを実行可能にします。
~]# chmod +x /usr/local/bin/foobar.sh