Linuxサーバを運用していると、 「毎日決まった時間に同じ処理を実行したい」 という場面がよくあります。
たとえば、次のような処理です。
毎日深夜に実行
5分ごとに実行
毎週月曜日に実行
このような処理を毎回人が実行するのは効率的ではありません。
Linuxでは、 cronという仕組みを利用することで、 指定した日時にコマンドやスクリプトを自動実行できます。
この記事では、 cronとcrontabの基本から、 「毎日3時」「5分ごと」「毎週月曜日」 といったスケジュールの設定方法まで、 実際に手を動かしながら学習します。
cronの役割とcrontabの書式を理解し、 実行したい日時から自分でcron式を組み立てられる ようになることを目指します。
cronとは?
cronは、 Linuxでコマンドやスクリプトを 指定した日時に自動実行するための仕組みです。
たとえば、 毎日午前3時にバックアップスクリプトを実行したい場合、 cronへ次のようなスケジュールを登録できます。
0 3 * * * /home/user/backup.sh
これを登録しておけば、 基本的には人が毎日午前3時にログインして コマンドを実行する必要はありません。
cronとcrontabの違い
初心者が最初に混同しやすいのが、 cronとcrontabです。
登録されたスケジュールをもとに、 指定された処理を実行します。
「いつ・何を実行するか」を 登録・確認・編集します。
crontabの基本コマンド
まずは、 現在のユーザーのcrontabを確認してみましょう。
crontab -l
$ crontab -l
0 3 * * * /home/user/backup.sh
*/5 * * * * /home/user/check.sh
登録内容を編集する場合は、 次のコマンドを使用します。
crontab -e
crontab -l
確認
現在の登録内容を表示
crontab -e
編集
crontabを編集
crontab -r
削除
現在のユーザーのcrontabを削除
crontab -rを実行すると、
現在のユーザーのcrontab登録内容が削除されます。
編集したいだけの場合はcrontab -eを使用します。
crontabの書式を理解しよう
cronを学ぶうえで最も重要なのが、 次の5項目です。
分 時 日 月 曜日 コマンド
│ │ │ │ │
│ │ │ │ └─ 曜日
│ │ │ └───── 月
│ │ └───────── 日
│ └───────────── 時
└───────────────── 分
順番は必ず、
です。
ここはcronで最も間違えやすいため、 まずこの順番を覚えましょう。
各項目に指定できる値
0 - 59
30
0 - 23
3
1 - 31
15
1 - 12
8
0 - 7
1
曜日では一般的に、 0または7が日曜日、1が月曜日、6が土曜日 として扱われます。
「*」は何を意味する?
cronでは、 *(アスタリスク) を非常によく使用します。
*は、
その項目のすべての値
を意味します。
0 3 * * *
分は0、時は3ですが、
日・月・曜日がすべて*になっています。
そのため、 「毎日3時0分」 という意味になります。
cronの代表的な設定例
毎日午前3時に実行
0 3 * * * /home/user/backup.sh
毎日18時30分に実行
30 18 * * * /home/user/report.sh
毎週月曜日の午前9時に実行
0 9 * * 1 /home/user/weekly.sh
毎月1日の午前0時に実行
0 0 1 * * /home/user/monthly.sh
「*/5」とは?一定間隔で実行する方法
cronでは、
*/5のような書き方もよく使います。
*/5 * * * * /home/user/check.sh
分の項目に*/5を指定すると、
対象となる分の範囲で
5分間隔という意味になります。
*/5は、
cronの分フィールドで5分間隔の値に一致するたびに実行する指定です。
1回だけ5分後に実行する指定ではありません。
「-」や「,」を使った指定
cronでは、 範囲や複数の値を指定することもできます。
平日の午前9時に実行
0 9 * * 1-5 /home/user/workday.sh
1-5は、
月曜日から金曜日まで
を表します。
月・水・金の午前9時に実行
0 9 * * 1,3,5 /home/user/task.sh
カンマを使用すると、 複数の値を個別に指定 できます。
「日」と「曜日」を同時指定するときは注意
cronを使い始めたときに特に注意したいのが、 「日」と「曜日」を両方具体的に指定するケース です。
0 9 15 * 1 /home/user/task.sh
「15日かつ月曜日だけ」と読みたくなりますが、 一般的なcron実装では、 日と曜日の両方が限定されている場合の一致条件に注意が必要 です。
cron実装では日付と曜日の扱いに独特のルールがあります。 意図しない実行を防ぐため、 複雑な条件を設定するときは使用しているcronの仕様を確認しましょう。
理解度チェック:cron式を読んでみよう
このcron式はいつ実行されるでしょうか?
左から「分 → 時 → 日 → 月 → 曜日」の順番です。
実際に作ってみよう:Cronスケジュール練習ツール
ここでは、 実行したい日時を選んでcron式を作ってみましょう。
それぞれの項目を変更すると、 cron式と実行タイミングが自動的に更新されます。
Cron Schedule Builder
0 3 * * * /home/user/script.sh
分=0、時=3、日・月・曜日=* のため、 毎日午前3時に実行されます。
実際に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で確認する習慣をつけましょう。
cronは「どのユーザーで実行されるか」も重要
cronでは、 実行ユーザーも非常に重要です。
ユーザーが
crontab -e
で登録した処理は、
基本的にそのユーザーの権限で実行されます。
crontab -e
そのため、 手動ではroot権限で実行していた処理を 一般ユーザーのcronへ登録すると、 権限不足で失敗する 可能性があります。
「手動では動くのにcronでは動かない」原因
cronで非常によくあるトラブルが、
cronから実行すると失敗する
というケースです。
原因の1つが、 実行環境の違いです。
cronから実行される処理では、 普段ログインしているシェルと 同じ環境変数やPATHが利用できるとは限りません。
ログイン時の環境変数やPATHなどを利用している
より限定された実行環境になる場合がある
そのため、 cronではコマンドを 絶対パスで指定することがあります。
/usr/bin/python3 /home/user/script.py
コマンドの場所は、
command -vなどで確認できます。
$ command -v python3
/usr/bin/python3
相対パスにも注意する
スクリプトの中で、 次のような相対パスを使用している場合も注意が必要です。
./data/output.log
cron実行時のカレントディレクトリが 想定している場所とは限らないためです。
ファイルやディレクトリを扱う場合は、
/home/user/data/output.log
のように絶対パスを使用すると、
実行場所の違いによるトラブルを減らせます。
cronの実行結果をログへ残す
cronは人が見ていない時間にも実行されるため、 成功したのか、失敗したのか確認できるようにする ことが重要です。
たとえば、 標準出力と標準エラー出力をログファイルへ保存できます。
0 3 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1
ここで使用している
>>は追記、
2>&1は標準エラー出力を標準出力と同じ出力先へまとめる指定です。
cronが動かないときの確認ポイント
cronを登録したのに実行されない場合は、 次の順番で確認してみましょう。
crontab -l
systemctl status crond
ディストリビューションによってサービス名は異なります。
分 → 時 → 日 → 月 → 曜日
Permission denied ?
/usr/bin/... /home/user/...
journalctl / cronログ / 独自ログ
障害切り分け:なぜこのcronは動かない?
バックアップが午前3時に実行されていない
次のcrontabが登録されています。
0 3 * * * backup.sh
手動でbackup.shを実行すると正常に動きます。
cronからだけ実行できません。
最初に改善候補として考えやすいのはどれでしょうか?
手動実行とcron実行では環境が異なることがあります。
確認問題:cronの基本をチェックしよう
毎日午前3時に処理を実行するcron式はどれですか?
cronは「分 → 時 → 日 → 月 → 曜日」の順です。
0分・3時なので0 3 * * *となります。
「5分ごと」に実行する指定はどれですか?
分フィールドへ*/5を指定すると、
5分間隔で実行されます。
手動では成功するコマンドがcronでは失敗します。 確認すべきポイントとして適切なのはどれですか?
cronとログインシェルでは実行環境が異なる場合があります。 PATH、権限、実行ユーザー、カレントディレクトリなどを確認します。
3問に挑戦してみましょう。
まとめ
cronを使うと、 Linuxでコマンドやスクリプトを定期的に自動実行できる
crontabの基本は 「分 → 時 → 日 → 月 → 曜日 → コマンド」
*はすべて、
*/5などのステップ指定は一定間隔を表す
crontab -lで確認し、
crontab -eで編集する
cronでは 実行ユーザー・権限・PATH・相対パス に注意する
定期処理は実行するだけでなく、 結果をログで確認できるようにする ことも重要
次はLinux障害対応の流れを身につけよう
ここまでのLinux中級講座では、 ユーザー・プロセス・サービス・ログ・パッケージ・ディスク・ネットワーク・cronなど、 Linuxサーバを管理するためのさまざまな操作を学んできました。
しかし実際の障害対応では、 「どのコマンドを知っているか」だけでは十分ではありません。
次の記事では、 これまで学んだコマンドを組み合わせて、 Linuxで障害が発生したときに何から確認すればよいのか を実践的に学習します。
次は「Linux障害発生時の基本的な切り分け方法」を学びましょう
「Webサイトにつながらない」 「ディスク容量が足りない」 「サービスが起動しない」などの障害に対して、 どのコマンドをどの順番で使えばよいのかを整理します。
Linux中級で学んできた知識を 実際の障害対応につなげる総合演習 として取り組みましょう。
Linux障害発生時の基本的な切り分け方法 →
