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 の起動が前提となる )などの処理がうまく行かないことがありえます。
他のデーモンプロセスに依存する場合は、プロセスチェックなどが必要になりそうですね。
ディスカッション
コメント一覧
まだ、コメントがありません