Crontabにシステム起動時に1度だけコマンドが実行されるように設定する方法

2022-10-14Bash,CentOS,Linux,Ubuntu

はじめに

man 5 crontab を読んでいてたまたま見つけたので紹介。

crontab の実装の違いにより使える、使えないがあるが、システム起動時に 1 度だけコマンドが実行されるような設定をかんたんに追加できます。

検証環境

$ uname -moi
x86_64 unknown GNU/Linux

man ページに書かれている

man 5 crontab をしたところ以下のように記述されています。

             string         meaning
             ------         -------
             @reboot        Run once, at startup.
             @yearly        Run once a year, "0 0 1 1 *".
             @annually      (same as @yearly)
             @monthly       Run once a month, "0 0 1 * *".
             @weekly        Run once a week, "0 0 * * 0".
             @daily         Run once a day, "0 0 * * *".
             @midnight      (same as @daily)
             @hourly        Run once an hour, "0 * * * *".

      Please note that startup, as far as @reboot is concerned, is the time when the cron(8) daemon startup.  In particular, it may be before some system
      daemons, or other facilities, were startup.  This is due to the boot order sequence of the machine.

crontab の各行の左 5 列は時間指定のために使われますが( ex: 0 12 * * * echo hoge で「毎日 12:00 に echo hoge を実行」 )、この部分に @reboot と記述することでサーバ再起動時に 1 回だけ実行されるような設定ができます。

@hourly / @daily / @weekly などがよく利用されるため、 @ の記述になれている方も多いでしょう。

試してみる

早速試してみます。

対象サーバにログインし、 crontab -e を実行後以下のような設定を記述します。

# 設定を記述
$ crontab -e

# 設定を確認
$ crontab -l | tail -n 1
@reboot date >> $HOME/date.log

設定ができたら、再起動してます。

$ sudo reboot now

再起動後、ログインしホームディレクトリ直下に date.log ができているか確認します。

$ cat date.log
Fri Jun  5 07:38:42 JST 2020

注意点

起動タイミングに他のデーモンプロセスが立ち上がっていない場合もある

man ページにも記載がありますが、利用の際には注意が必要です。

@reboot 利用時の「起動」とは cron(8)デーモンが起動するときであることに注意してください。
crond が立ち上がる前に他のデーモンプロセスが立ち上がっていることは保証されないため、 「DB に接続し何かを行う」mysqld の起動が前提となる )などの処理がうまく行かないことがありえます。

他のデーモンプロセスに依存する場合は、プロセスチェックなどが必要になりそうですね。

OS の起動だけではなく、 crond サービスの再起動で実行されてしまう環境もある

以下のページを参考にさせていただきました。

OS 環境によっては、 crond サービスの再起動にて @reboot を使って記述している cron ジョブが実行されることもあるようです。

OScron の再起動時の@reboot 実行有無cron の実装
FreeBSD 9.1実行されるVixie Cron
Debian 7.0実行されない(OS 起動時のみ)Vixie Cron + パッチ
CentOS 6.4実行されない(OS 起動時のみ)Cronie

上記のページでの調査では、 CentOS / Debian とよく使われる Linux OS はいずれも cron サービス再起動時には実行されないということです。
UbuntuFedoraRedhat あたりも同様の挙動であれば @reboot多くの環境で OS 起動時のみ実行される と解釈してよさそうですが、実際に調査していません。

もしご存じの方がいらっしゃればコメントください。

2022-10-14Bash,CentOS,Linux,Ubuntu