LinuC レベル1(LPIC-1対応)対策
cronとat
cron の失点はほとんど書式です。5つのフィールドの順番、曜日の数字、実行ユーザー欄の有無。この3つを外さなければ落としません。なお、この学習環境には cron も at も入っていないため、ここは読んで覚える回です。定期実行を実際に走らせるのは、systemd タイマーの回になります。
5フィールドは分・時・日・月・曜日
1行が1つの予定で、先頭の5つが時刻、6つ目以降が実行するコマンドです。
| 位置 | フィールド | 取りうる値 |
|---|---|---|
| 1 | 分 | 0-59 |
| 2 | 時 | 0-23 |
| 3 | 日 | 1-31 |
| 4 | 月 | 1-12 (jan-dec も可) |
| 5 | 曜日 | 0-7 (sun-sat も可) |
小さい単位から大きい単位へ並び、最後に曜日が付きます。曜日は 0 と 7 の両方が日曜日で、1 が月曜、6 が土曜です。日と曜日を両方指定した場合は、どちらか一方に一致すれば実行されます。AND ではなく OR です。
記法は * が全ての値、カンマが列挙、ハイフンが範囲、*/n が n 刻みです。*/15 は毎時 0分・15分・30分・45分のことで、「今から15分後」ではありません。5フィールドの代わりに @hourly @daily @monthly @yearly @reboot も使え、@reboot だけは時刻ではなく起動に紐づきます。
| 書き方 | いつ実行されるか |
|---|---|
0 3 * * * cmd | 毎日 3時ちょうど |
30 9 * * 1-5 cmd | 平日の 9時30分 |
/etc/crontab には6番目に実行ユーザー欄がある
ユーザーの crontab は crontab -e で編集し、実体は Debian 系なら /var/spool/cron/crontabs/<ユーザー名> に置かれ、持ち主の権限で動きます。/etc/crontab と /etc/cron.d/* はエディタで直接編集し、5つの時刻フィールドの次に実行ユーザーの欄が入ります。
プレーンテキスト
0 3 * * * /usr/local/bin/backup.sh # ユーザー crontab。5 + コマンド
0 3 * * * root /usr/local/bin/backup.sh # /etc/crontab。5 + ユーザー + コマンドユーザー欄を書き忘れると root がコマンド名として解釈されて失敗し、逆にユーザー crontab にユーザー名を書くと、それがコマンドとみなされます。
/etc/cron.hourly から /etc/cron.monthly までの4つのディレクトリに実行可能なスクリプトを置けば、時刻を書かずにその間隔で実行できます。なお cron は指定時刻に電源が入っていないとその回を飛ばします。経過日数で判断する anacron を併用すれば取り返せます。
crontab -r は確認なしで全部消える
| コマンド | 動作 |
|---|---|
crontab -e | 自分の crontab を編集する |
crontab -l | 自分の crontab を表示する |
crontab -r | 自分の crontab を丸ごと削除する |
crontab -u user -e | 指定ユーザーの crontab を編集する |
-r は確認を出さずに全部消します。試験は -l と並べて「一覧表示はどれか」と聞いてきます。開くエディタは環境変数 EDITOR か VISUAL で決まります。
使える人の制御は /etc/cron.allow と /etc/cron.deny です。判定には順序があり、cron.allow があればそれだけを見て cron.deny は無視されます。cron.allow が無い場合は、cron.deny に載っていないユーザーが使えます。空の cron.allow は誰も使えない、空の cron.deny は全員使える、と意味が正反対です。at にも同じ規則で /etc/at.allow と /etc/at.deny があります。
at は1回限りの予約
at は指定した時刻に1回だけ実行し、担うデーモンは atd です。atq で予約の一覧、atrm に番号を渡して取り消し、batch は時刻ではなく負荷が下がったときに実行します。
時刻の指定は柔軟です。at 10:00 は今日の10時で、過ぎていれば翌日の10時。at now + 1 hour は1時間後、at 3pm tomorrow は明日の15時、at -f script.sh 22:00 はファイルの内容を実行する予約です。at を打つと入力待ちになるので、実行したいコマンドを打ち込み Ctrl-D で終えます。
試験で狙われるところ
フィールドの順は分・時・日・月・曜日で、時が先ではありません。曜日は 0 も 7 も日曜です。日と曜日を両方書くと OR です。crontab -r は確認なしで全削除です。cron.allow があれば cron.deny は見られません。
復習ミニクイズ
`/etc/crontab` に `30 2 * * 1 root /usr/local/bin/backup.sh` と書かれています。この行の説明として正しいものはどれですか。