概要
Ubuntuで…
- 毎日朝5時に再起動。
- 13:05、14:05…のように毎時5分になったらバックアップ実行。
のようなことをしたい。
そのような『定時実行』は『cron』という機能を使えば可能。
この記事ではそのcronの設定方法についての基礎をまとめます。
cronってあんまり触らないから、次触る時は大抵…
「cronってどーやって設定したっけ? あ~…完全に忘れてるわこれ!(・ω<) てへぺろ」
ってなるから、そういう時に読んで思い出す用の記事!
設定ファイル単位
まず、cron設定ファイルはユーザー単位で存在する。
設定ファイル編集に入る時のコマンドは下記。
(OSの設定によるが、大抵の場合nanoっていう名前のエディタでcron設定ファイルが開かれる)
crontab -e
sudo crontab -e
「間違って編集しないように or ただ設定がどうなってるかだけ確認したい」
なんて時は crontab -l
または sudo crontab -l
でもいい。
(cron設定確認コマンド)
設定ファイルの場所
下記のような場合、cron設定ファイルの場所(ファイルパス)が必要になる。
-
crontab -e
はnanoという名前のエディタで開かれるが、慣れてるvimで編集したい。 - cron設定ファイルをバックアップ(コピー)したい。
cronの設定ファイルのパスは『/var/spool/cron/crontabs/ユーザー名』。
つまり、 sudo crontab -e
ではなく、下記のようなコマンドでも設定ファイルの編集は可。
sudo vi /var/spool/cron/crontabs/root
cronは『分 時 日 月 曜日 コマンド』で設定
例えば
毎時0分に『/home/backup.sh』っていうシェルスクリプトを実行
って時のcron設定値は下記。
0 * * * * /home/backup.sh
設定項目 | 備考 |
---|---|
分 | 0~59で設定。 |
時 | 0~23で設定。(24時間表記の値) |
日 | 1~31で設定。 |
月 | 1~12で設定。 |
曜日 | 0~7で設定。 0=日曜、1=月曜、2=火曜、3=水曜、4=木曜、5=金曜、6=土曜、7=日曜。 |
下記のようにコメント残しておくと便利かもね。
# 分 時 日 月 曜日 コマンド
# 0=日、1=月、2=火、3=水、4=木、5=金、6=土
0 * * * * /home/backup.sh #毎時0分にファイルサーバーバックアップ
(参考サイトのURLをコメントに残しておく形でもいいかもね)
全てを*にすると1分単位
cron実行間隔の最小単位は1分。
つまり、下記のように設定すると1分ごとに実行される。
* * * * * /home/backup.sh
『〇分毎』『〇時間毎』という設定も可
*/5 * * * * /home/dead_or_alive.sh
* */3 * * * /home/file_backup.sh
- 5分に一回死活監視して、落ちてたら通知飛ばす。
(すぐ通知させたいから1時間に1回だと少ない…) - 3時間に1回くらいの間隔でファイルサーバーのバックアップとりたい。
(1時間に1回だと多いけど、1日1回では少ない…)
なんて時に使えます。
『深夜3~4時は除外』『毎週月~金のみ』という設定も可
『-』で範囲指定、『,』区切りで列挙ができる。
例えば下記のようなこともできる。
0 0-2,5-23 * * * /tester.sh
0 0 * * 1-5 /tester.sh
- 日次の再起動中は死活監視を停止したい。
- 処理が集中する時間帯は実行しない。
- 重いバッチを実行するタイミングとcronによるバックアップが衝突しないように。
なんて時に使えます。
設定ファイル変更後に再起動などは不要
Ubuntuやcronの再起動は不要。
『設定ファイルをロードし直す』みたいなこともしなくてOK。
蛇足
実行タイミングはできるだけcronに寄せた方がいいと思う。
『cronでは毎時で設定して、シェルスクリプト内で曜日判定して実行する or しないを制御』
みたいなことすると cronの設定を見ただけだと実行タイミングが分からない ということになる。
というか、cron設定だけを見て「曜日関係なく実行してるんだ」って勘違いしてバグの元になる。
やむをえずそういう構成にする時はcron設定側にコメント残しておこう!
参考サイトさん
バージョン
Ubuntu 20.04.5 LTS
TODO:毎月31日に設定した時、2月28日は実行されないよね?(月末処理)
TODO:日に0などの想定範囲外の値をセットした時の挙動。(設定ミスした時、設定ミスの行だけスキップ?それとも後続全て止まる?)