23.5. systemd ユニットファイルを使用した次回ブート時のジョブの実行スケジュール

cron ユーティリティー、anacron ユーティリティー、at ユーティリティー、および batch ユーティリティーを使うと、特定の時間に、またはシステム負荷が特定のレベルに達したときに、ジョブを実行するように設定できます。また、次回のシステムブート時に実行するジョブを作成することもできます。これは、実行するスクリプトとその依存関係を指定する systemd ユニットファイルを作成することで行います。
次回の起動時に実行するスクリプトを設定するには、以下を実行します。
  1. 起動プロセスのどの段階でスクリプトを実行するかを指定する 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 のユニットファイルの作成および変更」 を参照してください。
  2. スクリプトの実行後も systemd サービスをアクティブに維持したいときは、RemainAfterExit=yes 行を [Service] セクションに追加します。
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/local/bin/foobar.sh
  3. systemd デーモンを再読み込みします。
    ~]# systemctl daemon-reload
  4. systemd サービスを有効にします。
    ~]# systemctl enable one-time.service
  5. 以下を実行するスクリプトを作成します。
    ~]# cat /usr/local/bin/foobar.sh
    #!/bin/bash
    
    touch /root/test_file
  6. スクリプトを次回のブート時のみに実行したいときは、systemd ユニットを無効にする行を追加します。
    #!/bin/bash
    
    touch /root/test_file
    systemctl disable one-time.service
  7. スクリプトを実行可能にします。
    ~]# chmod +x /usr/local/bin/foobar.sh