Cronを使ってLet's Encryptの自動更新とか設定したはいいものの,自動的にスクリプトが走っていないと感じた時とかに見直したい設定がある.それがタイムゾーン.
AWSでは作成したインスタンスではUTC(協定世界時.日本標準時より9時間前の時刻となる)になっているので,これをJST(日本標準時)に修正してあげる必要がある.ただし,OSの設定を変えるだけでは不十分なので,いくつか追加の作業が必要.
※ Cron自体の設定方法の記事はこの世界にありふれているため,この記事ではCron自体の設定方法は取り扱わない.
タイムゾーンの確認
$ date #現在時刻を確認する.
$ strings /etc/localtime #設定されているタイムゾーンを確認.
strings /etc/localtime
を実行した時に最後の行にUTCとかJSTとか書かれている.これが現在設定されているタイムゾーンとなる.ここが既にJSTである場合はCronの再起動や,Cron自体のタイムゾーンを確認する.
タイムゾーンを設定する
$ sudo timedatectl set-timezone Asia/Tokyo
timedatectl
を使ってタイムゾーンを設定する.JSTに設定したい場合はAsia/Tokyo
を指定する.このコマンドを実行した時点で反映されているはずなので,うまく設定されたか確認したい場合は先述したコマンドを実行する.
※重要※ Cronを再起動する
$ sudo service cron restart
これが最も重要.OSの設定を変えたところでCron側は知らんぷりしているのでタチが悪い.このコマンドを実行することにより,初めてCronはJSTで実行されるようになる.めでたしめでたし.
おまけ
簡単なTipsを掲載しておく.
ユーザごとにスケジュールを作成する
$ sudo crontab -u root -e
# Cronの設定ファイルの編集画面が起動する.
# 編集画面ではCtrl + S で保存,Ctrl + X で終了する.
Cronを実行するときはスクリプトを実行するユーザを指定できる.上の例はCronにrootで実行してもらいたいスクリプトを記述する時に使用する.ユーザ(e.g., ubuntu)で実行したい場合はsudo
をつけずにcrontab -u ubuntu -e
でCronのスケジュールを編集する.
Cronに登録されているスケジュールを確認する
$ ls /var/spool/cron/crontabs/
/var/spool/cron/crontabs/
のディレクトリ以下を確認することで,ユーザごとに作成したCronのスケジュールを確認できる.こんなことするよりも,該当ユーザでcrontab -l
をする方が早い.