cronの設定方法|crontabの書き方・オプション・実行例を解説

環境&ワークフロー

crontabの書き方は、crontab -eでエディタを開き「分 時 日 月 曜日 コマンド」の書式で1行書いて保存するだけで完了します。ただし、実際に運用するとなると「書式の意味」「よく使うオプション」「%(パーセント)を使うときの注意点」「設定が反映されたかの確認方法」「動かないときの原因」まで押さえておく必要があります。この記事ではcrontabの書き方を手順どおりに解説し、主要オプション・実行例・注意点までまとめて確認できるようにしています。コマンド例はすべてDebian環境の実機で動作確認済みです。

cronを設定する基本の流れ

cronの設定は、次の3ステップで完了します。

  1. crontab -eでcrontab(設定ファイル)をエディタで開く
  2. 「分 時 日 月 曜日 コマンド」の書式で実行したい内容を1行追加する
  3. 保存してエディタを閉じる(保存した時点で即座に反映される)
crontab -e

初めてcrontab -eを実行すると、EDITORまたはVISUAL環境変数に設定されたエディタが起動します(未設定の場合はnanoやvi、Debian/Ubuntuではselect-editorでエディタを選択する画面が出ることもあります)。実機で確認すると、初回は次のようなテンプレートコメント付きの空ファイルが開きます。

# 初回実行時のメッセージと雛形(Debian環境の実機で確認)
no crontab for root - using an empty one

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# m h  dom mon dow   command

この末尾に「分 時 日 月 曜日 コマンド」の1行を追加して保存すれば設定完了です。

# 毎日午前2時にバックアップを実行する設定例
0 2 * * * /home/user/backup.sh

crontabの書式(分 時 日 月 曜日 コマンド)

cronの設定は、次の書式で記述します。

分  時  日  月  曜日  実行コマンド
フィールド範囲説明
分(minute)0〜59実行する分
時(hour)0〜23実行する時
日(day of month)1〜31実行する日
月(month)1〜12実行する月
曜日(day of week)0〜7(0と7が日曜日)実行する曜日

各フィールドには次の記法が使えます。

  • *:すべての値に一致(毎分・毎時など)
  • */n:n間隔ごと(*/5 なら5分ごと)
  • a-b:aからbの範囲(1-5 なら月〜金)
  • a,b,c:複数の値を列挙(1,15 なら1日と15日)

自分で書いた書式が正しいか自信がない場合は、crontab.guruのようなオンラインツールに貼り付けると「次にいつ実行されるか」を人間が読める形で確認できます。本番環境に反映する前の検算に便利です。

コマンド欄で%(パーセント)を使うときの注意

crontabのコマンド欄では、%は改行文字として解釈されます。1個目の%より後ろの文字列はコマンドの標準入力として渡され、コマンド自体には含まれません。dateコマンドの書式指定子(%Y%m%dなど)をそのまま書くと意図しない動作になるため注意が必要です。

# NG: %がそのまま改行として扱われ、date以降が切り捨てられる
0 2 * * * /usr/bin/date +%Y%m%d >> /var/log/date.log

# OK: バックスラッシュで%をエスケープする
0 2 * * * /usr/bin/date +\%Y\%m\%d >> /var/log/date.log

複数の%を使う処理や複雑なコマンドは、crontabに直接書かずシェルスクリプトに切り出し、crontab側ではそのスクリプトを呼び出すだけにすると事故を防げます。

cron設定で使う主要オプション一覧

crontabコマンドには設定の編集以外にも、確認・削除・他ユーザー操作用のオプションがあります。実機で動作を確認した結果とあわせてまとめます。

オプション説明実機での挙動
crontab -ecrontabを編集する(エディタが開く)保存すると即座に反映される
crontab -l現在の設定内容を一覧表示する未設定時はno crontab for ユーザー名(終了コード1)
crontab ファイル指定したファイルの内容で新規登録・上書きする(標準入力からも可)crontab -crontab /tmp/mycronで一括登録できる
crontab -r設定を削除する(全削除されるため注意)確認なしで即削除される
crontab -i -r削除前に確認を挟む(-rと併用)誤操作防止に有効
crontab -u ユーザー名 -e/-l他ユーザーの設定を編集・確認するroot権限が必要。一般ユーザーはmust be privileged to use -u相当のエラー

特にcrontab -rは確認なしで全ジョブを削除するため、実行前にcrontab -l > crontab.bakなどでバックアップを取っておくと安全です。

cron設定の実行例(よく使うスケジュール)

# 毎日午前2時にバックアップを実行
0 2 * * * /home/user/backup.sh

# 5分ごとにディスク使用量をチェック
*/5 * * * * /usr/local/bin/check_disk.sh

# 毎週月曜日の朝9時にレポートを送信
0 9 * * 1 /home/user/weekly_report.sh

# 毎月1日の深夜0時にログをアーカイブ
0 0 1 * * /usr/local/bin/archive_logs.sh

# 平日(月〜金)の毎正時にジョブを実行
0 * * * 1-5 /home/user/workday_job.sh

# 毎日午前0時と正午の2回実行
0 0,12 * * * /home/user/twice_daily.sh

# 毎時15分・45分に実行
15,45 * * * * /home/user/check.sh

# 1時間ごとに実行(毎時0分)
0 * * * * /home/user/hourly.sh

# 毎分実行(テスト・監視用)
* * * * * /home/user/monitor.sh

毎週・毎月の細かい曜日指定や複数条件の組み合わせ方は毎週・毎月の定期処理を全自動化|cronの曜日指定・毎月実行 完全ガイドで詳しく解説しています。

特殊文字列(@マクロ)で簡潔に設定する

よく使うスケジュールは @ から始まる特殊文字列で簡潔に設定できます。

記法意味
@rebootシステム起動時に1回だけ実行
@yearly@annually年に1回(0 0 1 1 * と同じ)
@monthly月に1回(0 0 1 * * と同じ)
@weekly週に1回(0 0 * * 0 と同じ)
@daily@midnight毎日1回(0 0 * * * と同じ)
@hourly毎時1回(0 * * * * と同じ)
# 起動時に自動実行
@reboot /home/user/start_service.sh

# 毎日深夜に実行
@daily /home/user/daily_cleanup.sh

環境変数の設定

cronの実行環境は通常のシェルと異なり、PATHなどの環境変数が最小限しか設定されていません。crontabファイル内で環境変数を定義できます。

# crontabの先頭で環境変数を定義
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/home/user/bin
MAILTO=admin@example.com

# コマンドの出力は MAILTO で指定したアドレスにメール送信される
0 2 * * * /home/user/backup.sh

# メール送信を無効にする(出力を破棄)
0 * * * * /home/user/job.sh > /dev/null 2>&1

MAILTO="" を設定するとメール送信を無効化できます。コマンドの出力ログを残したい場合は > /var/log/myjob.log 2>&1 のようにファイルにリダイレクトしましょう。

設定した内容を確認する

設定後は、意図どおりに登録されているかを確認する対象によって使うコマンドが変わります。

確認したい対象コマンド
自分の設定crontab -l
他のユーザーの設定crontab -u ユーザー名 -l(root権限が必要)
全ユーザーの設定ループでcrontab -uを順次実行(root権限が必要)
システム全体の設定cat /etc/crontabls /etc/cron.d/
実際に実行されたかどうかjournalctl -u cron または grep CRON /var/log/syslog
# 実行例
$ crontab -l
0 2 * * * /home/user/backup.sh
*/5 * * * * /usr/local/bin/check_disk.sh

ユーザーごとのcrontab以外に、システム全体で定期実行を設定するファイルも存在します。これらはcrontabコマンドではなく、ファイルを直接確認・編集します。

場所説明
/etc/crontabシステム全体のcrontab(ユーザー名フィールドが追加される)
/etc/cron.d/パッケージが追加するcron設定ファイルを置くディレクトリ
/etc/cron.hourly/1時間ごとに実行されるスクリプト置き場
/etc/cron.daily/毎日実行されるスクリプト置き場
/etc/cron.weekly/毎週実行されるスクリプト置き場
/etc/cron.monthly/毎月実行されるスクリプト置き場
# /etc/crontab の書式(ユーザー名フィールドが追加される)
# 分  時  日  月  曜日  ユーザー  コマンド
0 2 * * * root /usr/local/bin/backup.sh

cron設定でよくある注意点・トラブルシューティング

設定したのにコマンドが実行されない場合は、以下の順番で確認します。

1. cron デーモンが起動しているか確認

# systemdの場合
systemctl status cron      # Debian/Ubuntu
systemctl status crond     # RHEL/CentOS

# 起動していない場合
sudo systemctl start cron
sudo systemctl enable cron  # 自動起動を有効化

systemctlコマンド自体の使い方はsystemctl コマンド|Linuxサービス管理の基本と使い方で解説しています。

2. コマンドは絶対パスで指定しているか確認

cronのPATHは通常のシェルより短く、/usr/local/binなどが含まれない場合があります。コマンドは絶対パスで指定するのが安全です。

# NG: 相対パスやエイリアス
0 2 * * * backup.sh
0 2 * * * python script.py

# OK: 絶対パスで指定
0 2 * * * /home/user/backup.sh
0 2 * * * /usr/bin/python3 /home/user/script.py

3. スクリプトに実行権限があるか確認

# 実行権限を確認
ls -la /home/user/backup.sh

# 実行権限がない場合は付与
chmod +x /home/user/backup.sh

4. crontab の書式エラーを確認

# 現在の設定を表示して確認
crontab -l

# よくある書式ミス例
# NG: 分・時フィールドの範囲外(60分や25時など)
# NG: フィールドが5つ未満または多すぎる
# NG: コマンドパスのタイポ

5. スクリプトのエラーをログに出力して確認

# 標準出力と標準エラーをログファイルに記録
0 2 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1

# ログを確認してエラーがないか調べる
tail -f /var/log/backup.log

6. ユーザーの cron 実行が許可されているか確認

# /etc/cron.allow が存在する場合、このファイルにユーザー名がある必要がある
cat /etc/cron.allow

# /etc/cron.deny が存在する場合、このファイルにユーザー名があると実行できない
cat /etc/cron.deny

/etc/cron.allow/etc/cron.denyで制限されている場合、crontab -e実行時にyou are not allowed to use this programのようなメッセージが表示されます。管理者に依頼して許可を得る必要があります。

7. スクリプト単体での動作確認

# cron と同じ最小限の環境変数でスクリプトをテスト実行
env -i HOME=/root SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin /home/user/backup.sh

ジョブが多重起動しないようロックを取る方法や、標準出力のリダイレクト・エラー処理まで含めた実務向けの設定ルールは手動実行から卒業|cronでシェルを毎日/毎週自動化する基本でまとめています。多重起動を防ぐflockコマンドの詳しい設定方法はflockコマンドとは?cronの多重起動防止とファイルロックの使い方を参照してください。

cronとcrontabの関係

cronはバックグラウンドで動き続けるデーモンプロセス(crondまたはcron)で、crontabはユーザーごとに独立して持てる定期実行スケジュールの設定ファイルです。cronがcrontabに書かれたスケジュールを1分単位で監視し、条件に合致した時刻にコマンドを呼び出す、という役割分担になっています。

代表的な設定用途は次のとおりです。

cronの代替手段

定期実行を行う手段はcronだけではありません。目的に応じてatコマンドやsystemdタイマーも選択肢になります。

手段用途特徴
cron繰り返しのスケジュール実行設定がシンプル。多くのディストリビューションに標準搭載
atコマンド1回限りの遅延実行at 22:00のように指定時刻に1度だけ実行。繰り返しには不向き
anacron電源offで実行できなかったジョブの補完ノートPCなど常時起動していない環境向け。分単位の指定はできない
systemdタイマー繰り返し・依存関係のある実行他のsystemdユニットとの依存関係やログ管理(journald)と統合しやすい

systemdタイマーを使う場合は.timerユニットと.serviceユニットを組み合わせます。ユニットファイルの基本的な書き方はsystemdユニットの基本と再起動戦略で解説しています。既存の運用でcrontabに慣れている場合は、無理に移行せずcronのままで問題ありません。

よくある質問(FAQ)

cronの設定はどこに書けばいいですか?

crontab -eでユーザーごとのcrontabを開き、「分 時 日 月 曜日 コマンド」の書式で1行追加します。システム全体の設定を書く場合は/etc/crontab/etc/cron.d/配下にファイルを追加します(この場合はコマンドの前にユーザー名フィールドが必要です)。

設定した内容はどうやって反映されますか?

crontab -eで保存してエディタを閉じた時点で即座に反映されます。再起動やcronの再起動は不要です。反映内容はcrontab -lで確認できます。

設定したのに実行されないときは?

まずsystemctl status cron(RHEL系はcrond)でデーモンが動いているか確認し、次にコマンドを絶対パスで書いているか、スクリプトに実行権限があるかを確認します。詳しくは本記事の「cron設定でよくある注意点・トラブルシューティング」を参照してください。

設定を一時的に止めたい(無効化したい)ときは?

crontabに専用の無効化コマンドはありません。crontab -eで対象行の先頭に#を付けてコメントアウトするのが一般的です。すべて止めたい場合はcrontab -rで削除しますが、元に戻せなくなるため事前にcrontab -l > crontab.bakでバックアップを取っておくと安全です。

同じジョブが多重実行されるのを防ぐには?

前回の実行が終わる前に次のスケジュールが来ると、同じジョブが多重起動してしまうことがあります。flockコマンドでファイルロックを取ることで多重起動を防げます。詳しい設定方法はflockコマンドとは?cronの多重起動防止とファイルロックの使い方で解説しています。

まとめ

cronの設定方法をまとめます。

  • crontab -eでcrontabを開き、「分 時 日 月 曜日 コマンド」の書式で1行追加して保存すれば設定完了
  • 保存した時点で即座に反映され、再起動は不要
  • よく使うスケジュールは@dailyなどの@マクロで簡潔に書ける
  • 設定内容はcrontab -lで確認、削除はcrontab -r(バックアップ推奨)
  • コマンドは絶対パスで指定し、実行権限を付与しておく
  • 動かないときはsystemctl status cronでデーモンの起動状態から確認する

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント