Linux定期実行の基本:crontabで自動化をマスターする

Linuxサーバーを運用していると、バックアップの実行やログの整理、定期的なレポート生成など、決まった時間に自動で処理を実行したい場面が頻繁にあります。そんな時に活躍するのが、Linux標準のジョブスケジューラであるcronと、その設定を行うcrontabコマンドです。

この記事では、crontabの基本的な使い方から、ジョブの登録・確認・削除方法、そして知っておくと便利な設定例までを解説します。

この記事でわかること
  • crontabの基本的な書式と時間の指定方法
  • 定期実行ジョブの登録、確認、削除方法
  • crontabの応用的な使い方(エイリアス、出力制御など)
  • 困った時のトラブルシューティングと調査方法

crontabとは?

crontab(クロンタブ)は、ユーザーごとに定期的に実行したいコマンドやスクリプトを登録するためのファイル、またはそのファイルを編集するコマンドのことです。crontabに登録されたジョブは、cronデーモンによって指定された時間に自動的に実行されます。


crontabコマンドの基本

crontabを操作するための主なコマンドは以下の通りです。

コマンド 意味
crontab -e 現在のユーザーのcrontabファイルを編集します。初回実行時にはエディタ選択を求められることがあります。
crontab -l 現在のユーザーのcrontabファイルの内容を表示します。
crontab -r 現在のユーザーのcrontabファイルを削除します。これにより登録されているジョブが全て削除されますので、実行には注意が必要です。
crontab -e -u <user> 特定のユーザーのcrontabファイルを編集します。rootユーザーのみ実行可能です。
crontab -l -u <user> 特定のユーザーのcrontabファイルの内容を表示します。rootユーザーのみ実行可能です。

crontabの書式:時間を正確に指定する

crontabのエントリは、以下の5つの時間指定フィールドと、実行するコマンドから構成されます。

分 時 日 月 曜日 実行コマンド

各フィールドの意味と指定できる値は以下の通りです。

フィールド 意味 指定できる値
0-59 毎時0分に実行する場合: 0
0-23 毎日午前3時に実行する場合: 3
1-31 毎月1日に実行する場合: 1
1-12 毎年1月に実行する場合: 1
曜日 0-7 (0と7は日曜日) 毎週日曜日に実行する場合: 0 または 7

特殊な記号

記号 意味
* 全ての時間、日、月、曜日に一致(毎日、毎時、毎分など) * * * * * command (毎分実行)
, 複数の値を指定 0 3,15 * * * command (毎日3時と15時に実行)
- 範囲を指定 0 9-17 * * * command (毎日9時から17時まで毎時0分に実行)
/ 間隔を指定(例: /5は5分ごと) */5 * * * * command (5分ごとに実行)

crontabへのジョブ登録例

バックアップスクリプト /home/user/backup.sh を毎日午前2時30分に実行したい場合を考えます。

  1. crontabの編集モードに入る

    crontab -e
  2. 以下の行を追加して保存

    30 2 * * * /bin/bash /home/user/backup.sh

    保存後、crontab: installing new crontab のようなメッセージが表示されれば成功です。 crontab -e で編集した内容は、保存すると同時にcronデーモンに読み込まれ、即座に反映されます。複数行のジョブも、この1つのファイルにまとめて記述して問題ありません。


crontabをさらに便利に使う小技集
特殊な書式エイリアス

cronには、日付指定が複雑な場合に便利なエイリアスが用意されています。

エイリアス 意味 分 時 日 月 曜日 の指定と同等
@reboot 起動時に1回実行 ―(システム起動時)
@yearly 年に一度 0 0 1 1 * (毎年1月1日 0時0分)
@annually 年に一度 0 0 1 1 * (毎年1月1日 0時0分)
@monthly 月に一度 0 0 1 * * (毎月1日 0時0分)
@weekly 週に一度 0 0 * * 0 (毎週日曜日 0時0分)
@daily 毎日 0 0 * * * (毎日 0時0分)
@hourly 毎時 0 * * * * (毎時0分)

例:サーバー起動時にスクリプトを実行

@reboot /home/user/startup.sh

例:毎日バックアップスクリプトを実行

@daily /home/user/daily_backup.sh
ジョブの出力制御

cronジョブの標準出力や標準エラー出力は、デフォルトでcrontabを登録したユーザーのメールアドレスに送信されます。これを止めたり、ファイルにリダイレクトしたりできます。

  • 出力を完全に破棄する

    メール通知が不要な場合、/dev/null にリダイレクトします。2>&1 は標準エラー出力も標準出力と同じ場所(ここでは/dev/null)にリダイレクトする意味です。

    30 2 * * * /bin/bash /home/user/backup.sh > /dev/null 2>&1
  • 特定のファイルにログを出力する

    実行結果をファイルに残したい場合は、ファイルにリダイレクトします。>> は追記モードです。

    30 2 * * * /bin/bash /home/user/backup.sh >> /var/log/backup_cron.log 2>&1
  • 通知メールの送信先を変更する

    crontabファイルの先頭に MAILTO 変数を設定することで、通知メールの送信先を変更できます。MAILTO はファイル内で最初に設定すれば、以降のすべてのジョブに適用されます。空にするとメールは送信されなくなります。

    MAILTO="your_email@example.com"
    # MAILTO="" # メールを送信しない場合
    30 2 * * * /bin/bash /home/user/backup.sh
crontabのバックアップと復元

誤ってcrontabを削除してしまったり、別のサーバーに同じ設定を移行したい場合に役立ちます。

  • 現在のcrontabをバックアップ

    crontab -l > mycrontab.bak
  • バックアップしたcrontabを復元

    crontab mycrontab.bak

    このコマンドを実行すると、既存のcrontabは上書きされるので注意してください。

crontabの編集を取り消したい(保存せず終了)

crontab -e で編集中に、誤って変更してしまった内容を保存せずに終了したい場合、以下のエディタ操作が役立ちます。

  • viエディタの場合: Esc キーを押した後、:q! と入力して Enter
  • nanoエディタの場合: Ctrl + X を押した後、N(No)を押して Enter

この状況で困ったらコレ:トラブルシューティング
ジョブが実行されない
  • 実行パスの確認: crontabは実行環境のPATHが限定的です。コマンドは絶対パスで指定するか、スクリプト内でPATHを設定しましょう。
    • 例: /usr/bin/php/usr/local/bin/python など。
  • 環境変数の確認: スクリプトが特定の環境変数に依存する場合、crontab内で設定するか、スクリプトの先頭で設定してください。
  • 実行ユーザーの確認: crontabは、登録したユーザーの権限で実行されます。必要な権限があるか確認しましょう。
  • シェルの確認: スクリプトの先頭に #!/bin/bash#!/usr/bin/python のように、使用するインタプリタを明記(シバン)しましょう。
  • ログの確認:
    • ジョブの実行結果は、通常は実行ユーザーにメールで送信されます。mail コマンドで確認するか、コマンドの最後に >> /var/log/cron_job.log 2>&1 を追加して標準出力と標準エラー出力をファイルにリダイレクトし、ログを確認します。
    • cronデーモン自体のログを確認することも重要です。
      • CentOS/RHEL系: /var/log/cron
      • Ubuntu/Debian系: /var/log/syslog または journalctl -u cron.service これらのログでcronデーモンが正常に動作しているか、ジョブが実行された記録があるかを確認できます。
cronデーモンの状態確認(OSによる違い)

cronデーモンがそもそも起動しているか確認します。コマンドはLinuxディストリビューションによって異なる場合があります。

  • systemdを使用するディストリビューション(Ubuntu 15.04以降, CentOS 7以降など)
    systemctl status cron  # Ubuntu/Debian系
    systemctl status crond # CentOS/RHEL系
  • 古いSysVinitを使用するディストリビューション
    service cron status # Ubuntu/Debian系
    service crond status # CentOS/RHEL系
システム全体のcrontabファイル

一般的なユーザーは crontab -e で個人用のcrontabを編集しますが、システム全体で管理されるcrontabファイルも存在します。 主に /etc/crontab/etc/cron.d/ ディレクトリ内のファイルで、これらはroot権限で編集し、cron デーモンが直接読み込みます。ユーザーごとのcrontabと異なり、実行するユーザーを明示的に指定できるのが特徴です。 大量のシステムジョブや、特定のアプリケーションの定期実行を設定する際に利用されますが、通常は個人用の crontab -e で十分です。


まとめ

この記事では、Linuxの定期実行を司るcrontabについて、その基本からジョブの登録、確認、削除、応用的な使い方、そしてトラブルシューティングまでを解説しました。crontabを使いこなすことで、日々のLinuxサーバー管理・運用が格段に楽になります。

この記事がcrontabについて理解を深める一助となれば幸いです。
ご覧いただきありがとうございました。

次回はディスク容量の確認と整理方法について解説します。

私たちは、お客さまが私たちのウェブサイトをどのように使用するのかを理解し、お客さまの体験を改善するために Cookie を使用しています。 閲覧を続けると Cookie の使用に同意したことになります。
拒否した場合、このウェブサイトにアクセスしてもお客さまの情報は追跡されません。 情報を追跡しない設定を記憶するために、ウェブブラウザで 1 つだけ Cookie が使用されます。