はじめに
こんにちは。アメリカにて独学でエンジニアを目指している者です。
現在Linuxを勉強中ですが、Linux/Unix系OSで定期的にコマンドやスクリプトを実行するための仕組みとして便利な“cron”機能があります。その設定を行うためのコマンドが“crontab”です。ここでは、crontabの概要や書式、具体的な例などを解説します。
crontabとは
crontab
は、Linux/Unix系OSで定期的に実行するジョブを登録・管理するためのコマンドです。以下の特徴があります。
- cron: 常駐プロセスとして動作し、設定された時刻になるとタスクを自動実行する
- crontab: cronに登録するジョブを編集するためのコマンド
定期的にバックアップを取ったり、ログをローテーションしたり、メンテナンス作業を自動化するときに利用されます。
crontabの基本書式
crontabに登録する内容は次の形式で記述します。
分 時 日 月 曜日 コマンド
- 分 (0–59)
- 時 (0–23)
- 日 (1–31)
- 月 (1–12)
- 曜日 (0–7) (0/7:日曜、1:月曜〜6:土曜)
- コマンド: 実行したいコマンドやスクリプトのパスなど
ワイルドカードや特殊記号
-
*
: 全ての値 -
,
: リスト (例:1,5,10
) -
-
: 範囲 (例:1-5
) -
/
: ステップ(間隔) (例:*/10
は10分置き)
特殊な書式
-
@reboot
: システム起動時 -
@yearly
(または@annually
) : 毎年1月1日 0:00 -
@monthly
: 毎月1日 0:00 -
@weekly
: 毎週日曜日 0:00 -
@daily
(または@midnight
) : 毎日 0:00 -
@hourly
: 毎時 0分
crontabの基本操作
crontabファイルを編集
通常、crontab -e
コマンドでユーザーごとの設定を編集します。エディタが開き、行ごとにジョブを追加します。
例: 毎日深夜2時30分にバックアップスクリプトを実行する
30 2 * * * /home/user/scripts/backup.sh
crontabファイルを確認
crontab -l
crontabファイルを削除
crontab -r
システム全体のcrontab
/etc/crontab
システム全体でのタスクを設定する/etc/crontab
では以下の形式で書き、ユーザーを指定します。
分 時 日 月 曜日 ユーザー コマンド
例: 毎日深夜2時30分に root
ユーザー権限でスクリプトを実行
30 2 * * * root /root/scripts/maintenance.sh
/etc/cron.*ディレクトリ
/etc/cron.daily/
などのディレクトリにスクリプトを設置すると、対応するタイミングで自動実行されます。
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
注意点
-
環境変数: cron実行時はシェルのログインスクリプトが読み込まれないため、
PATH
など環境変数が異なる場合がある。 - ログ出力: トラブルシューティングや確認のため、出力をログファイルにリダイレクトしておくと便利。
- 権限設定: 実行するスクリプトの所有者やパーミッションを確認する。
- メール通知: cronは結果をメールで送信できる。設定しておくとエラー検知などに役立つ。
-
誤設定に注意: 特に日や曜日の組み合わせによっては想定外のタイミングで実行されることがあるため、編集後は
crontab -l
で再確認。
具体的な設定例
-
毎分実行
* * * * * /home/user/scripts/check_status.sh
-
10分おき
*/10 * * * * /home/user/scripts/task.sh
-
毎日朝9時に実行
0 9 * * * /home/user/scripts/report.sh
-
毎週月曜の23時
0 23 * * 1 /home/user/scripts/weekly_job.sh
-
土日の深夜3時
0 3 * * 6,0 /home/user/scripts/weekend_job.sh
まとめ
-
crontab -e
でスケジュールを設定、crontab -l
で一覧表示 -
/etc/cron.*
ディレクトリを活用するとシステムレベルで簡易的なスケジュール管理が可能 - 環境変数やパーミッション、エラー時のメール通知などに注意を払うと、保守がしやすい
cronという仕組みを知ることで自動化をする一助となります。このコマンドを勉強していた最中にQiitaの記事投稿の自動化も思いついたので近いうちに投稿しようと思います。