Crontabにシステム起動時に1度だけコマンドが実行されるように設定する方法
はじめに
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 ジョブが実行されることもあるようです。
OS | cron の再起動時の@reboot 実行有無 | cron の実装 |
---|---|---|
FreeBSD 9.1 | 実行される | Vixie Cron |
Debian 7.0 | 実行されない(OS 起動時のみ) | Vixie Cron + パッチ |
CentOS 6.4 | 実行されない(OS 起動時のみ) | Cronie |
上記のページでの調査では、 CentOS / Debian とよく使われる Linux OS はいずれも cron サービス再起動時には実行されないということです。
Ubuntu や Fedora 、 Redhat あたりも同様の挙動であれば @reboot
は 多くの環境で OS 起動時のみ実行される と解釈してよさそうですが、実際に調査していません。
もしご存じの方がいらっしゃればコメントください。
ディスカッション
コメント一覧
まだ、コメントがありません