11
3

More than 1 year has passed since last update.

Ubuntuでcronを使った定期実行の基礎

Last updated at Posted at 2022-12-18

概要

Ubuntuで…

  • 毎日朝5時に再起動。
  • 13:05、14:05…のように毎時5分になったらバックアップ実行。

のようなことをしたい。

そのような『定時実行』は『cron』という機能を使えば可能。

この記事ではそのcronの設定方法についての基礎をまとめます。

cronってあんまり触らないから、次触る時は大抵…
「cronってどーやって設定したっけ? あ~…完全に忘れてるわこれ!(・ω<) てへぺろ」
ってなるから、そういう時に読んで思い出す用の記事!

設定ファイル単位

まず、cron設定ファイルはユーザー単位で存在する。

設定ファイル編集に入る時のコマンドは下記。
(OSの設定によるが、大抵の場合nanoっていう名前のエディタでcron設定ファイルが開かれる)

ログインしてるユーザーのcron設定編集に入るコマンド
crontab -e
rootユーザーのcron設定編集編集に入るコマンド
sudo crontab -e

「間違って編集しないように or ただ設定がどうなってるかだけ確認したい」
なんて時は crontab -l または sudo crontab -l でもいい。
(cron設定確認コマンド)

設定ファイルの場所

下記のような場合、cron設定ファイルの場所(ファイルパス)が必要になる。

  • crontab -e はnanoという名前のエディタで開かれるが、慣れてるvimで編集したい。
  • cron設定ファイルをバックアップ(コピー)したい。

cronの設定ファイルのパスは『/var/spool/cron/crontabs/ユーザー名』。

つまり、 sudo crontab -e ではなく、下記のようなコマンドでも設定ファイルの編集は可。

rootユーザーのcron設定ファイルをvimから直接編集するコマンド
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分ごとに実行するcron設定値
*/5 * * * * /home/dead_or_alive.sh
3時間ごとに実行するcron設定値
* */3 * * * /home/file_backup.sh
  • 5分に一回死活監視して、落ちてたら通知飛ばす。
    (すぐ通知させたいから1時間に1回だと少ない…)
  • 3時間に1回くらいの間隔でファイルサーバーのバックアップとりたい。
    (1時間に1回だと多いけど、1日1回では少ない…)

なんて時に使えます。

『深夜3~4時は除外』『毎週月~金のみ』という設定も可

『-』で範囲指定、『,』区切りで列挙ができる。

例えば下記のようなこともできる。

毎時0分、ただし0時~2時と5時~23時のみ実行する設定 = 深夜3~4時は除外という設定
0 0-2,5-23 * * * /tester.sh
毎週月~金曜の午前0時実行する設定 = 土日は除外という設定
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などの想定範囲外の値をセットした時の挙動。(設定ミスした時、設定ミスの行だけスキップ?それとも後続全て止まる?)

11
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3