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

Bash,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 の起動が前提となる )などの処理がうまく行かないことがありえます。

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

Bash,CentOS,Linux,Ubuntu