Linux / Crontabの使い方

Linuxでは、crontabを使用すると、指定された時間にコマンドやスクリプトを繰り返し実行できます。crontab -eを使うと、現在のユーザーのスケジュール済みタスクを編集でき、5つの時間フィールドと実行するコマンドを1行で入力できます。

cronとcrontabの違い

cronは、定期的にスケジュールされたタスクを確認して実行するサービスです。crontabは、実行時間とコマンドを記録するタスクの一覧で、通常はユーザーごとに個別に管理されます。この記事の例は、DebianおよびUbuntuシリーズの典型的なユーザーcrontabに基づいています。インストール方法、サービス名、およびサポートされる機能は、ディストリビューションやcronの実装によって異なる場合があります。

スケジュールされたタスクは、対応するcrontabの所有者権限で実行されます。現在のユーザーが持っていない権限が必要な場合は、管理者および実行アカウントを慎重に設定し、不要に広範な権限でタスクを作成しないでください。コンピュータがオフになっているときやcronサービスが停止しているときにスケジュールされたタスクは、実行されません。

Crontabの確認と編集

ターミナルで、次のコマンドを使用して現在のユーザーのスケジュールされたタスクを確認します。リストがないというメッセージが表示された場合、そのユーザーはまだcrontabを持っていないことを意味します。

crontab -l

タスクを追加または変更するには、次のコマンドを実行します。初めて実行するときは、エディタ選択画面が表示される場合があります。ファイルを保存してエディタを終了すると、cronが構文を確認し、新しいリストをインストールします。エラーが表示された場合は、指示に従って再度編集し、インストールメッセージが表示されることを確認してください。

crontab -e

管理者アカウントの予約タスクは現在のユーザーのものとは別です。管理者権限が必要な場合に限り、sudo crontab -eでrootの一覧を編集し、sudo crontab -lで確認します。二つの一覧を混同しないでください。

単一のタスクを削除するには、crontab -eでその行だけを削除して保存します。crontab -rは現在のユーザーのスケジュールされたタスクのリスト全体を削除するため、使用前にリストを確認し、必要であれば安全な場所にバックアップしてください。crontab -l > ~/crontab-backup.txtでバックアップでき、復元が必要な場合はcrontab ~/crontab-backup.txtでファイル全体を再インストールします。復元は現在のリストを上書きするため、まず変更がないか確認してください。

スケジュール時間のフォーマット

ユーザーのcrontabの各ジョブは、5つの時刻フィールドと、その後に続くコマンドで構成されます。/etc/crontabや/etc/cron.d/内のシステムcrontabファイルでは、時刻フィールドとコマンドの間に実行ユーザーのフィールドが追加されるため、以下の形式をそのままコピーしないでください。

minute hour day-of-month month day-of-week command
フィールド 許容範囲 意味
分 0–59 分
時 0–23 時
日(1か月の) 1–31 日
月 1–12 月
曜日 0–7 曜日。0と7は日曜日です

* はフィールド内のすべての値を指します。カンマは複数の値を指定します(10,20)、ハイフンは範囲を指定します(1-5)、スラッシュは範囲内の間隔を指定します(*/10)。例えば、分フィールドでの */10 は毎時 0、10、20、30、40、50 分を意味します。間隔は各フィールド内で解釈されるため、経過時間に基づいた同じ間隔が必ずしも保証されるわけではありません。

日付と曜日の両方が制限されている場合、Debianのcronはいずれかの条件を満たす日に実行されます。たとえば、0 4 1 * 1は毎月1日と毎週月曜日の午前4時に実行されますが、1日が月曜日の場合にのみ実行されるわけではありません。詳細な形式は、システムのman 5 crontabまたはDebian cronのcrontab形式のドキュメントで確認できます。

スケジュールされたジョブの例

以下の例で/home/user/bin/backup.shを実際のスクリプトの絶対パスに置き換えてください。ユーザーはスクリプトおよび対象ファイルにアクセスできる必要があり、スクリプトを直接実行する場合には、実行権限と正しいインタープリタの指定も必要です。まず、同じアカウントでターミナルで実行して結果を確認してください。

0 4 * * * /home/user/bin/backup.sh
0 4 * * 1-5 /home/user/bin/backup.sh
*/10 4 * * * /home/user/bin/backup.sh

1行目は毎朝4時に実行され、2行目は月曜日から金曜日の毎朝4時に実行され、3行目は毎朝4時から4時50分まで10分ごとに実行されます。例は独立したスケジュールです。すべて入力すると、各行のすべてのタスクが登録されます。

ジョブを安全に登録してテストする

練習時には、実際のバックアップの代わりに、現在のユーザーのホームディレクトリに記録を残すタスクを使用してみてください。

  1. crontab -eを実行し、次の単一行を追加してから保存して終了します。日付と時刻が毎分ファイルに追記されます。
* * * * * /bin/date >> "$HOME/cron-test.log" 2>&1
  1. インストール済みのエントリを確認するためにcrontab -lを実行します。1〜2分後にcat ~/cron-test.logを実行し、記録が追加されていることを確認します。
  2. 確認が完了したら、crontab -eの練習エントリのみを削除して保存してください。内容を確認した後でログファイルを削除しても構いません。

練習が機能しない場合は、cronサービスがインストールされて実行されているかどうかを確認してください。典型的なUbuntuのcronパッケージでは、systemctl status cronでステータスを確認できます。サービス名やログの場所はディストリビューションによって異なり、systemdジャーナルを使用しているUbuntu環境では、journalctl -u cronでサービスのログを確認できます。

動作しない場合の確認ポイント

cron はログインシェルとは異なる環境で実行される場合があります。可能な限りコマンドやスクリプトは絶対パスで指定し、必要な環境変数や作業ディレクトリをスクリプト内で明確に定義してください。エラーを確認するために、ジョブの出力やエラーをユーザーがアクセスできるログファイルにリダイレクトすることもできます。ログには機密情報が含まれる場合があるので、アクセス権限や保持期間に注意してください。

システム時間やタイムゾーンが期待通りか、実行アカウントがファイルにアクセスできるか、重複実行の可能性がないかを確認してください。コマンドで使用される % は cron に特別に扱われるため、文字通り渡す場合は通常 \% でエスケープする必要があります。正確な挙動については、使用している cron のドキュメントを確認してください。