「毎日深夜にバックアップを自動で取りたい」「定期的にログを削除するスクリプトを走らせたい」——Linuxを運用していると、こうした定期的な処理を自動化したい場面が必ず出てきます。
そのときに使うのがcrontabです。Linuxに標準搭載されているジョブスケジューラーで、指定した日時や間隔でコマンドやスクリプトを自動実行できます。しかし「書き方が分からない」「設定したのに動かない」「どう確認すればいいか分からない」という声も多く聞かれます。
本記事では、crontabの基本概念から構文の読み方、ジョブの登録・確認・削除、よくある応用例、設定が反映されないときの対処法まで、初心者の方でもすぐに実践できるよう体系的に解説します。
crontabとは

cronとcrontabの基本概念
cronはLinuxのバックグラウンドで常に動作しているデーモン(常駐プロセス)で、定められたスケジュールに従ってコマンドやスクリプトを自動実行する仕組みです。
crontabは「cron table(cronのテーブル)」の略で、cronが参照するスケジュール定義ファイルのことを指します。また、そのファイルを編集するためのコマンド名でもあります。
| 用語 | 意味 |
|---|---|
| cron | 定期実行を管理するデーモン(常駐プロセス) |
| crontab | スケジュール定義ファイル、または編集コマンド |
| cronジョブ | cronによって定期実行されるコマンドや処理のこと |
定期実行ジョブを管理する仕組み
cronデーモンは毎分起動し、crontabファイルに記述されたスケジュールと現在時刻を照合します。一致するジョブがあれば自動的に実行される仕組みです。ユーザーが何もしなくても、サーバーが起動している限り定期的な処理が継続されます。
各ユーザーは自分専用のcrontabファイルを持ち、システム管理者(root)はシステム全体に影響するジョブを管理できます。
用途とメリット
バックアップの自動化
毎日深夜にデータベースやファイルのバックアップスクリプトを実行することで、手動操作なしに定期バックアップを実現できます。バックアップ忘れによるデータ損失リスクを大幅に下げられます。
定期レポートの生成
毎週月曜日の朝にアクセスログを集計してレポートファイルを生成する、毎月1日に月次集計を実行するなど、定型的なレポート作成作業を完全に自動化できます。
システムメンテナンスの自動化
古いログファイルの削除、キャッシュのクリア、ディスク使用量の定期チェックなど、システムを健全に保つためのメンテナンス処理もcronで自動化できます。人の手が届きにくい深夜や週末にも確実に実行されます。
crontabの基本構文

crontabの書式
crontabの1行は、時間指定フィールドとコマンドで構成されます。
分 時 日 月 曜日 実行するコマンド
具体例を見てみましょう。
30 2 * * * /home/user/backup.sh
これは「毎日午前2時30分に/home/user/backup.shを実行する」という意味になります。
時間指定の方法(分・時・日・月・曜日)
| フィールド | 指定できる値 | 意味 |
|---|---|---|
| 分 | 0〜59 | 何分に実行するか |
| 時 | 0〜23 | 何時に実行するか |
| 日 | 1〜31 | 何日に実行するか |
| 月 | 1〜12 | 何月に実行するか |
| 曜日 | 0〜7(0と7が日曜日) | 何曜日に実行するか |
曜日は数値のほかにsun・mon・tueなどの英字3文字でも指定できます。
特殊文字の使い方(* , – /)
すべての値を指定する *
*は「すべての値」を意味します。そのフィールドのすべてのタイミングで実行します。
* * * * * /path/to/command
これは毎分実行することを意味します。
範囲を指定する –
-は範囲を指定します。
0 9-17 * * * /path/to/command
これは「毎日9時から17時の間、毎時0分に実行」という意味です。
間隔指定 /
/は間隔(ステップ)を指定します。
*/15 * * * * /path/to/command
これは「15分ごとに実行」という意味です。*/15は「0分から始まり15分ごと」と解釈されます。
リスト指定 ,
,は複数の値をリストで指定します。
0 8,12,18 * * * /path/to/command
これは「毎日8時・12時・18時の0分に実行」という意味です。
crontabの設定方法

ユーザー別のcrontab編集方法
各ユーザーのcrontabファイルは独立して管理されます。一般ユーザーは自分のcrontabのみ編集でき、rootユーザーはすべてのユーザーのcrontabを編集できます。
別のユーザーのcrontabをrootとして編集する場合は以下のように指定します。
sudo crontab -u ユーザー名 -e
crontab -eの使い方
自分のcrontabを編集するには以下のコマンドを実行します。
crontab -e
初めて実行する場合、使用するテキストエディタを選択するプロンプトが表示される場合があります。選択後、crontabファイルがエディタで開かれます。
編集後の保存方法
viやnanoなどエディタでの操作
viで編集している場合は、iでインサートモードに入り編集後、ESC→:wqで保存して終了します。nanoを使っている場合は、編集後にCtrl+Oで保存、Ctrl+Xで終了します。
設定反映の確認方法
保存後、cronデーモンは自動的に新しい設定を読み込みます。以下のコマンドで現在のcrontabの内容を確認して、正しく保存されているかチェックします。
crontab -l
注意:crontab -eを使わずに直接crontabファイルを編集するとエラーの原因になります。必ずcrontab -eコマンドを使って編集してください。
crontabでジョブを登録する方法
コマンドの指定方法
crontabにコマンドを登録する際は、実行するコマンドまたはスクリプトのフルパスを指定します。
# 毎日午前3時にバックアップスクリプトを実行
0 3 * * * /home/user/scripts/backup.sh
毎時30分にPythonスクリプトを実行
30 * * * * /usr/bin/python3 /home/user/scripts/report.py
コマンド自体もフルパスで指定することを推奨します。cronの実行環境はログインシェルとは異なるためPATHが限られており、コマンド名だけでは認識されない場合があります。
標準出力やエラー出力のリダイレクト
cronジョブの出力は標準ではメールで通知されます。ログファイルに保存したい場合はリダイレクトを使います。
# 標準出力をログファイルに保存
0 3 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
ここで2>&1は「標準エラー出力(2)を標準出力(1)と同じ場所に出力する」という意味です。これにより正常出力とエラー出力の両方がログファイルに記録されます。
| 記述 | 意味 |
|---|---|
> ファイル |
標準出力をファイルに上書き保存 |
>> ファイル |
標準出力をファイルに追記保存 |
2>&1 |
標準エラーを標準出力と同じ出力先に |
/dev/null |
出力を破棄(何も記録しない) |
ジョブのテスト方法
ログファイルへの出力
ジョブが正しく動作しているかを確認するため、テスト段階では必ずログファイルへ出力する設定を入れましょう。
*/5 * * * * /home/user/test.sh >> /tmp/test.log 2>&1
5分ごとに実行してログを確認することで、動作を素早く検証できます。
動作確認のコツ
本番投入前に以下の流れでテストすることを推奨します。
- スクリプトを手動で直接実行して動作確認する
- 短い間隔(毎分または5分ごと)でcrontabに登録してログを確認する
- 正しく動作を確認してから本番のスケジュールに変更する
crontabでジョブを管理する方法
登録済みジョブの確認(crontab -l)
現在登録されているcronジョブをすべて表示するには以下のコマンドを使います。
crontab -l
登録されているジョブがない場合は「no crontab for ユーザー名」と表示されます。別ユーザーのcrontabを確認するには以下のようにします。
sudo crontab -u ユーザー名 -l
ジョブの削除方法(crontab -r / crontab -e)
特定のジョブだけを削除したい場合はcrontab -eでファイルを開き、該当行を削除して保存します。
すべてのcronジョブをまとめて削除する場合は以下のコマンドを使います。
crontab -r
crontab -rはすべてのジョブを即座に削除します。確認なしで実行されるため、誤って実行しないよう注意してください。削除前にcrontab -lで内容を確認し、別ファイルに保存しておくことを強く推奨します。
ジョブの一時停止や無効化の方法
ジョブを完全に削除せずに一時的に無効化したい場合は、行頭に#を付けてコメントアウトします。
# 一時停止中(#を外すと有効になる)
0 3 * * * /home/user/backup.sh
再度有効にするときは#を削除するだけです。設定の意図をコメントとして残しておくと、後から見たときに分かりやすくなります。
よく使うcrontabの応用例
毎日特定時間にスクリプトを実行する
# 毎日午前2時にバックアップを実行
0 2 * * * /home/user/scripts/daily_backup.sh >> /var/log/backup.log 2>&1
毎日18時にレポートを生成
0 18 * * * /usr/bin/python3 /home/user/scripts/daily_report.py
毎週・毎月の定期処理
# 毎週日曜日の午前1時に週次処理を実行
0 1 * * 0 /home/user/scripts/weekly_cleanup.sh
毎月1日の午前3時に月次集計を実行
0 3 1 * * /home/user/scripts/monthly_summary.sh
特定の曜日だけ処理する例
# 平日(月〜金)の午前9時にジョブを実行
0 9 * * 1-5 /home/user/scripts/weekday_job.sh
土曜日と日曜日の午前10時に実行
0 10 * * 6,0 /home/user/scripts/weekend_report.sh
バックアップやデータ同期の自動化
# 毎日深夜0時にrsyncでデータを同期
0 0 * * * rsync -av /home/user/data/ /mnt/backup/data/ >> /var/log/rsync.log 2>&1
毎時間データベースのダンプを取得
0 * * * * /usr/bin/mysqldump -u root -p'password' mydb > /backup/mydb_$(date +%Y%m%d%H).sql
注意:crontab内でパーセント記号(%)を使う場合は\%とエスケープする必要があります。エスケープしないと改行文字として解釈されます。
crontabの実践的な設定例については、N-laboratory「Linuxのcron設定と活用例」も参考になります。
crontabを使う上での注意点
環境変数の設定
cronの実行環境はログインシェルとは異なり、PATHなどの環境変数が制限されています。ログインシェルでは動くコマンドがcronでは動かないことがよくあります。
crontabファイルの先頭で環境変数を明示的に設定することで対処できます。
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
以降にジョブを記述
0 3 * * * /home/user/backup.sh
フルパス指定の重要性
コマンドやスクリプトは必ずフルパスで指定してください。cronのPATHは限られているため、コマンド名だけでは「command not found」エラーになる場合があります。
# 悪い例(cronの環境ではpythonが見つからない可能性がある)
0 3 * * * python report.py
良い例(フルパスで指定)
0 3 * * * /usr/bin/python3 /home/user/scripts/report.py
コマンドのフルパスはwhich コマンド名で確認できます。
権限の確認
スクリプトファイルに実行権限がない場合、cronジョブは失敗します。スクリプトを登録する前に実行権限を付与しておきます。
chmod +x /home/user/scripts/backup.sh
また、スクリプトがアクセスするファイルやディレクトリに対して、cronを実行するユーザーが読み書きの権限を持っているかも確認が必要です。
cronが実行されない原因と対処
ログを確認する方法
cronの実行ログはシステムログに記録されます。以下のコマンドで確認できます。
# Debian/Ubuntu系
grep CRON /var/log/syslog
CentOS/RHEL系
grep CRON /var/log/cron
ジョブが実行されているかどうか、エラーが発生していないかをここで確認します。
パーミッションやシェルの違いに注意
cronジョブが実行されない主な原因は以下のとおりです。
- スクリプトに実行権限がない
- コマンドのパスが間違っている
- 環境変数が設定されていない
- cronデーモン自体が起動していない
- crontabの構文エラー
cronデーモンの起動状態は以下で確認できます。
systemctl status cron # Debian/Ubuntu系
systemctl status crond # CentOS/RHEL系
Red Hat Enterprise Linuxにおけるcronの詳細な設定については、Red Hat公式ドキュメント「システムタスクの自動化」も参照してください。
crontabの便利なテクニック
出力のメール通知設定
cronジョブの出力はデフォルトでローカルメールに送られます。メールアドレスを指定することで、外部メールへの通知も可能です。
MAILTO="[email protected]"
0 3 * * * /home/user/backup.sh
メール通知が不要な場合はMAILTO=""と設定することで無効にできます。
MAILTO=""
0 3 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
条件付き実行の書き方
ファイルの存在確認など、条件を満たす場合だけ実行する書き方です。
# ファイルが存在する場合のみ処理を実行
0 3 * * * [ -f /home/user/data.csv ] && /home/user/scripts/process.sh
シェルの条件式([ ])とAND演算子(&&)を組み合わせることで、前の条件がTrueの場合のみ後のコマンドを実行します。
重複ジョブの防止方法
前回のジョブが終わっていないのに次のジョブが起動する「重複実行」は、リソース競合やデータ破損の原因になります。flockコマンドを使うことで重複実行を防げます。
# flockでロックファイルを使い重複実行を防止
*/10 * * * * flock -n /tmp/myjob.lock /home/user/scripts/heavy_job.sh
-nオプションにより、ロックが取得できない場合(前のジョブが実行中)は新しいジョブの起動をスキップします。
バックグラウンドでの実行とログ管理
長時間かかるジョブはバックグラウンドで実行し、出力を日付入りのログファイルに保存することで管理しやすくなります。
# 日付付きログファイルに出力
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup_$(date +%Y%m%d).log 2>&1 &
ログファイルは日付ごとに分かれるため、過去の実行履歴を追いやすくなります。古いログファイルが蓄積しないよう、定期的に削除するジョブも合わせて設定しておきましょう。
# 30日以上前のログファイルを削除
0 4 * * * find /var/log/ -name "backup_*.log" -mtime +30 -delete
crontabのより詳しい設定と運用方法については、インフラマニュアル「Linuxのcron設定ガイド」とエンジニア入門「crontabコマンドの使い方完全解説」も参考にしてください。
Linuxコマンドの使い方やサーバー運用の効率化については、kakiro-web.comでも幅広く解説しています。
まとめ
crontabはLinuxで定期実行ジョブを管理する便利なツール
crontabはLinux標準のジョブスケジューラーで、コマンド一行でバックアップ・レポート生成・システムメンテナンスなどを完全自動化できます。一度設定すれば人の手を介さずに定期処理が継続されるため、運用の効率化に欠かせないツールです。
基本構文と時間指定を理解することが重要
crontabの構文は「分 時 日 月 曜日 コマンド」の5フィールドです。*・-・/・,の特殊文字を使いこなすことで、毎分・毎時・特定曜日・間隔実行など多彩なスケジュールに対応できます。
正しい設定と管理でシステム運用を効率化できる
ジョブの登録はcrontab -e、確認はcrontab -l、全削除はcrontab -rで管理します。不要なジョブはコメントアウトで一時停止、完全不要なら行ごと削除するのが基本です。
ログ確認や注意点を押さえて安全に運用する
cronジョブが動かない原因の多くは、フルパス未指定・実行権限なし・環境変数の問題です。ログを確認する習慣と、テスト環境での動作確認を徹底することで、安全で信頼性の高い自動化運用が実現できます。
- crontabの編集は必ず
crontab -eコマンドを使う - コマンドとスクリプトは必ずフルパスで指定する
- スクリプトには事前に実行権限(
chmod +x)を付与する - 出力は
>> ログファイル 2>&1でファイルに保存して確認できるようにする - cronのPATHは制限されているため、crontabファイル内で環境変数を設定する
crontab -rはすべてのジョブを削除するため慎重に使う- 動作確認は短い間隔でテストしてからスケジュールを本番設定に変更する

