Linux入門:コマンド操作のきほん
cron で定期実行
毎晩 3 時に起きて手で打つわけにいかない
バックアップも、証明書の更新も、動かすべき時刻は決まっているのに人は寝ています。決めた時刻にコマンドを叩いてくれる常駐の仕組みが cron です。
登録は 1 行です。左から 5 つの数字で時刻を、そのうしろに実行したいものを書きます。
ターミナル
# 分 時 日 月 曜 コマンド
0 3 * * * /usr/local/bin/backup.sh* は「どれでも」という意味なので、この行は日付や曜日を問わず毎日 3 時 0 分に動きます。
| 位置 | 意味 | 範囲 |
|---|---|---|
| 1 つ目 | 分 | 0 から 59 |
| 2 つ目 | 時 | 0 から 23 |
| 3 つ目 | 日 | 1 から 31 |
| 4 つ目 | 月 | 1 から 12 |
| 5 つ目 | 曜日 | 0 から 7 で 0 と 7 が日曜 |
*/5 と書けば 5 分ごと、1-5 なら月曜から金曜、0,30 なら 0 分と 30 分の 2 回です。編集は crontab -e、いま登録されている内容の確認は crontab -l で行います。似た名前の crontab -r は登録を全部消す操作で、確認も出ません。打ち間違いで消えるので使わないでください。
手で打つと動くのに、cron からは動かない
いちばん多いつまずきがこれです。cron が起動するシェルは、ログインしたときのシェルとは別物で、.bashrc を読みません。使える PATH は最小限しか通っていないため、自分で入れたコマンドが見つかりません。
対策は 2 つあります。コマンドを絶対パスで書くこと、そして必要なら crontab の先頭で PATH を宣言することです。
ターミナル
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 3 * * * /usr/local/bin/backup.sh時刻がずれる場合も同じ理由です。サーバーの時間帯が UTC のままなら、TZ=Asia/Tokyo を同じ位置に書いて明示します。
失敗しても、誰も気づかない
cron はコマンドの出力をローカルのメールへ送ろうとします。配送の設定がなければ、そのまま消えます。数か月動いていなかったバックアップに、必要になった日に気づくのはこのためです。
出力は必ずファイルに残します。
ターミナル
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1>> で追記し、2>&1 でエラーの側も同じファイルに合流させます。
登録したら、いきなり本番の時刻で待たないでください。まず */1 * * * * の毎分で数分だけ動かし、ログに記録が増えることを確かめます。動いたと分かってから、本来の時刻に書き換えます。