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の違い

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

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中級講座へ戻る
目次