cronとは?crontabでLinux処理を自動実行する方法を初心者向けに解説

  • URLをコピーしました!

Linuxサーバを運用していると、 「毎日決まった時間に同じ処理を実行したい」 という場面がよくあります。

たとえば、次のような処理です。

03:00 バックアップ

毎日深夜に実行

EVERY 5 MIN 監視処理

5分ごとに実行

MONDAY 集計処理

毎週月曜日に実行

このような処理を毎回人が実行するのは効率的ではありません。

Linuxでは、 cronという仕組みを利用することで、 指定した日時にコマンドやスクリプトを自動実行できます。

この記事では、 cronとcrontabの基本から、 「毎日3時」「5分ごと」「毎週月曜日」 といったスケジュールの設定方法まで、 実際に手を動かしながら学習します。

🐧 LINUX INTERMEDIATE

この記事はLinux中級講座の一部です。 cronを使ったLinux処理の自動実行について学習します。

Linux中級講座を見る →
LESSON GOAL この記事のゴール

cronの役割とcrontabの書式を理解し、 実行したい日時から自分でcron式を組み立てられる ようになることを目指します。

目次

cronとは?

cronは、 Linuxでコマンドやスクリプトを 指定した日時に自動実行するための仕組みです。

CRONTAB 実行予定を登録
CRON 時刻を監視
COMMAND 自動実行

たとえば、 毎日午前3時にバックアップスクリプトを実行したい場合、 cronへ次のようなスケジュールを登録できます。

0 3 * * * /home/user/backup.sh

これを登録しておけば、 基本的には人が毎日午前3時にログインして コマンドを実行する必要はありません。

cronとcrontabの違い

初心者が最初に混同しやすいのが、 croncrontabです。

CRON 自動実行する仕組み

登録されたスケジュールをもとに、 指定された処理を実行します。

CRONTAB 実行予定を管理

「いつ・何を実行するか」を 登録・確認・編集します。

cron = 実行する仕組み crontab = cronへ渡す実行予定表

crontabの基本コマンド

まずは、 現在のユーザーのcrontabを確認してみましょう。

crontab -l
Linux Terminal
$ crontab -l
0 3 * * * /home/user/backup.sh
*/5 * * * * /home/user/check.sh

登録内容を編集する場合は、 次のコマンドを使用します。

crontab -e
crontab -l 確認 現在の登録内容を表示
crontab -e 編集 crontabを編集
crontab -r 削除 現在のユーザーのcrontabを削除
CAUTION crontab -rには注意

crontab -rを実行すると、 現在のユーザーのcrontab登録内容が削除されます。 編集したいだけの場合はcrontab -eを使用します。

crontabの書式を理解しよう

cronを学ぶうえで最も重要なのが、 次の5項目です。

0
3
*
*
* 曜日
/home/user/backup.sh 実行するコマンド
分  時  日  月  曜日  コマンド
│   │   │   │   │
│   │   │   │   └─ 曜日
│   │   │   └───── 月
│   │   └───────── 日
│   └───────────── 時
└───────────────── 分

順番は必ず、

分 → 時 → 日 → 月 → 曜日

です。

ここはcronで最も間違えやすいため、 まずこの順番を覚えましょう。

各項目に指定できる値

項目 範囲
0 - 59 30
0 - 23 3
1 - 31 15
1 - 12 8
曜日 0 - 7 1

曜日では一般的に、 0または7が日曜日、1が月曜日、6が土曜日 として扱われます。

0 / 7
1
2
3
4
5
6

「*」は何を意味する?

cronでは、 *(アスタリスク) を非常によく使用します。

*は、 その項目のすべての値 を意味します。

0 3 * * *
RESULT 毎日 午前3:00

分は0、時は3ですが、 日・月・曜日がすべて*になっています。

そのため、 「毎日3時0分」 という意味になります。

cronの代表的な設定例

毎日午前3時に実行

0 3 * * * /home/user/backup.sh
RUN 毎日 03:00

毎日18時30分に実行

30 18 * * * /home/user/report.sh
RUN 毎日 18:30

毎週月曜日の午前9時に実行

0 9 * * 1 /home/user/weekly.sh
RUN 毎週月曜日 09:00

毎月1日の午前0時に実行

0 0 1 * * /home/user/monthly.sh
RUN 毎月1日 00:00

「*/5」とは?一定間隔で実行する方法

cronでは、 */5のような書き方もよく使います。

*/5 * * * * /home/user/check.sh
RUN 5分ごと

分の項目に*/5を指定すると、 対象となる分の範囲で 5分間隔という意味になります。

00 05 10 15 20
*/5 = 「5分後に1回」ではない

*/5は、 cronの分フィールドで5分間隔の値に一致するたびに実行する指定です。 1回だけ5分後に実行する指定ではありません。

「-」や「,」を使った指定

cronでは、 範囲や複数の値を指定することもできます。

平日の午前9時に実行

0 9 * * 1-5 /home/user/workday.sh
RUN 月〜金 09:00

1-5は、 月曜日から金曜日まで を表します。

月・水・金の午前9時に実行

0 9 * * 1,3,5 /home/user/task.sh
RUN 月・水・金 09:00

カンマを使用すると、 複数の値を個別に指定 できます。

「日」と「曜日」を同時指定するときは注意

cronを使い始めたときに特に注意したいのが、 「日」と「曜日」を両方具体的に指定するケース です。

0 9 15 * 1 /home/user/task.sh

「15日かつ月曜日だけ」と読みたくなりますが、 一般的なcron実装では、 日と曜日の両方が限定されている場合の一致条件に注意が必要 です。

IMPORTANT 「日」と「曜日」のAND条件だと思い込まない

cron実装では日付と曜日の扱いに独特のルールがあります。 意図しない実行を防ぐため、 複雑な条件を設定するときは使用しているcronの仕様を確認しましょう。

理解度チェック:cron式を読んでみよう

CRON EXPRESSION 30 2 * * 1-5

このcron式はいつ実行されるでしょうか?

回答を選択してください

左から「分 → 時 → 日 → 月 → 曜日」の順番です。

実際に作ってみよう:Cronスケジュール練習ツール

ここでは、 実行したい日時を選んでcron式を作ってみましょう。

それぞれの項目を変更すると、 cron式と実行タイミングが自動的に更新されます。

INTERACTIVE LAB

Cron Schedule Builder

LEARNING MODE
GENERATED CRON 0 3 * * * 0 3 * * * /home/user/script.sh
WHEN DOES IT RUN? 毎日 03:00 に実行

分=0、時=3、日・月・曜日=* のため、 毎日午前3時に実行されます。

TRY EXAMPLES

実際にcrontabへ登録してみよう

たとえば、 次のスクリプトを毎日午前3時に実行するとします。

/home/user/backup.sh

まずcrontabを編集します。

$ crontab -e

次の1行を追加します。

0 3 * * * /home/user/backup.sh

保存したら、 登録内容を確認します。

$ crontab -l
0 3 * * * /home/user/backup.sh
登録後はcrontab -lで確認する

編集したつもりでも、 意図した内容になっているとは限りません。 登録後にcrontab -lで確認する習慣をつけましょう。

cronは「どのユーザーで実行されるか」も重要

cronでは、 実行ユーザーも非常に重要です。

ユーザーが crontab -e で登録した処理は、 基本的にそのユーザーの権限で実行されます。

USER user
crontab -e
RUN AS user

そのため、 手動ではroot権限で実行していた処理を 一般ユーザーのcronへ登録すると、 権限不足で失敗する 可能性があります。

「手動では動くのにcronでは動かない」原因

cronで非常によくあるトラブルが、

ターミナルから実行すると成功するのに、
cronから実行すると失敗する

というケースです。

原因の1つが、 実行環境の違いです。

cronから実行される処理では、 普段ログインしているシェルと 同じ環境変数やPATHが利用できるとは限りません。

TERMINAL 手動実行

ログイン時の環境変数やPATHなどを利用している

CRON 自動実行

より限定された実行環境になる場合がある

そのため、 cronではコマンドを 絶対パスで指定することがあります。

/usr/bin/python3 /home/user/script.py

コマンドの場所は、 command -vなどで確認できます。

$ command -v python3
/usr/bin/python3

相対パスにも注意する

スクリプトの中で、 次のような相対パスを使用している場合も注意が必要です。

./data/output.log

cron実行時のカレントディレクトリが 想定している場所とは限らないためです。

cronではパスを明確にする

ファイルやディレクトリを扱う場合は、 /home/user/data/output.log のように絶対パスを使用すると、 実行場所の違いによるトラブルを減らせます。

cronの実行結果をログへ残す

cronは人が見ていない時間にも実行されるため、 成功したのか、失敗したのか確認できるようにする ことが重要です。

たとえば、 標準出力と標準エラー出力をログファイルへ保存できます。

0 3 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1
backup.sh 処理を実行
標準出力 標準エラー
backup.log ログへ保存

ここで使用している >>は追記、 2>&1は標準エラー出力を標準出力と同じ出力先へまとめる指定です。

cronが動かないときの確認ポイント

cronを登録したのに実行されない場合は、 次の順番で確認してみましょう。

01
crontabに登録されているか crontab -l
02
cronサービスが動いているか systemctl status crond ディストリビューションによってサービス名は異なります。
03
cron式が正しいか 分 → 時 → 日 → 月 → 曜日
04
実行ユーザー・権限は正しいか Permission denied ?
05
PATHや相対パスに問題がないか /usr/bin/... /home/user/...
06
ログにエラーが出ていないか journalctl / cronログ / 独自ログ
登録 → サービス → 時刻 → 権限 → パス → ログ

障害切り分け:なぜこのcronは動かない?

SCENARIO

バックアップが午前3時に実行されていない

次のcrontabが登録されています。

0 3 * * * backup.sh

手動でbackup.shを実行すると正常に動きます。 cronからだけ実行できません。

最初に改善候補として考えやすいのはどれでしょうか?

回答を選択してください

手動実行とcron実行では環境が異なることがあります。

確認問題:cronの基本をチェックしよう

QUESTION 01

毎日午前3時に処理を実行するcron式はどれですか?

正解:B

cronは「分 → 時 → 日 → 月 → 曜日」の順です。 0分・3時なので0 3 * * *となります。

QUESTION 02

「5分ごと」に実行する指定はどれですか?

正解:C

分フィールドへ*/5を指定すると、 5分間隔で実行されます。

QUESTION 03

手動では成功するコマンドがcronでは失敗します。 確認すべきポイントとして適切なのはどれですか?

正解:A

cronとログインシェルでは実行環境が異なる場合があります。 PATH、権限、実行ユーザー、カレントディレクトリなどを確認します。

YOUR SCORE 0 / 3

3問に挑戦してみましょう。

まとめ

01

cronを使うと、 Linuxでコマンドやスクリプトを定期的に自動実行できる

02

crontabの基本は 「分 → 時 → 日 → 月 → 曜日 → コマンド」

03

*はすべて、 */5などのステップ指定は一定間隔を表す

04

crontab -lで確認し、 crontab -eで編集する

05

cronでは 実行ユーザー・権限・PATH・相対パス に注意する

06

定期処理は実行するだけでなく、 結果をログで確認できるようにする ことも重要

次はLinux障害対応の流れを身につけよう

ここまでのLinux中級講座では、 ユーザー・プロセス・サービス・ログ・パッケージ・ディスク・ネットワーク・cronなど、 Linuxサーバを管理するためのさまざまな操作を学んできました。

しかし実際の障害対応では、 「どのコマンドを知っているか」だけでは十分ではありません。

01 症状を確認
02 原因候補を絞る
03 コマンドで確認
04 原因を特定

次の記事では、 これまで学んだコマンドを組み合わせて、 Linuxで障害が発生したときに何から確認すればよいのか を実践的に学習します。

NEXT LESSON

次は「Linux障害発生時の基本的な切り分け方法」を学びましょう

「Webサイトにつながらない」 「ディスク容量が足りない」 「サービスが起動しない」などの障害に対して、 どのコマンドをどの順番で使えばよいのかを整理します。

Linux中級で学んできた知識を 実際の障害対応につなげる総合演習 として取り組みましょう。

Linux障害発生時の基本的な切り分け方法
LINUX INTERMEDIATE

Linux中級講座の一覧へ戻る

Linux中級の学習順を確認したい場合は、 講座一覧へ戻りましょう。

← Linux中級講座へ戻る
目次