Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linux Crontab完全マスターガイド:実務で使えるCronジョブスケジューリング15の実例

Linux Crontab完全マスターガイド:実務で使えるCronジョブスケジューリング15の実例経験豊富なLinuxシステム管理者なら、定期的なメンテナンス作業をバックグラウンドで自動実行させることの重要性を誰よりもよく理解しています。

LinuxのCronユーティリティは、特定の日時を指定してルーチン作業を継続的に自動実行するための強力かつ効果的なツールです。

本記事では、初心者から上級者まですぐに活用できる、crontabジョブスケジューリングの15の実践的な事例をわかりやすく解説します。

Linux Crontabの基本書式

MIN HOUR DOM MON DOW CMD
フィールド説明指定可能な値
MIN0〜59
HOUR0〜23
DOM日(月内の日付)1〜31
MON1〜12
DOW曜日0〜6(0=日曜日)
CMDコマンド実行したい任意のコマンド

1. 特定の時刻にジョブをスケジュールする

cronの最も基本的な使い方は、指定した時刻にジョブを実行することです。以下の例では、6月10日の午前8時30分にフルバックアップシェルスクリプト(full-backup)を実行します。

30 08 10 06 * /home/ramesh/full-backup
  • 30 – 30分
  • 08 – 午前8時
  • 10 – 10日
  • 06 – 6月
  • * – 曜日はすべて(毎日)

時刻フィールドは24時間表記を使用します。午前8時なら「8」、午後8時なら「20」と指定してください。

2. 1日に複数回実行する(例:1日2回)

次の例では、毎日11時と16時に増分バックアップシェルスクリプト(incremental-backup)を実行します。カンマ区切りで複数の時刻を指定すると、そのすべての時刻でコマンドが実行されます。

00 11,16 * * * /home/ramesh/bin/incremental-backup
  • 00 – 0分(ちょうどの時)
  • 11,16 – 午前11時と午後4時
  • * – 毎日
  • * – 毎月
  • * – すべての曜日

3. 特定の時間帯にだけ実行する(例:平日のみ)

特定の時間帯の中で毎時ジョブを実行したい場合は、範囲指定を使います。

勤務時間中に毎日実行するCronジョブ

この例では、土日を含む毎日の勤務時間(午前9時〜午後6時)にデータベースの状態をチェックします。

00 09-18 * * * /home/ramesh/bin/check-db-status
  • 00 – 0分(ちょうどの時)
  • 09-18 – 午前9時〜午後6時の毎時
  • * – 毎日
  • * – 毎月
  • * – すべての曜日

平日の勤務時間中に実行するCronジョブ

こちらは土日を除く平日のみ、勤務時間(午前9時〜午後6時)にデータベースの状態をチェックする例です。

00 09-18 * * 1-5 /home/ramesh/bin/check-db-status
  • 00 – 0分(ちょうどの時)
  • 09-18 – 午前9時〜午後6時の毎時
  • * – 毎日
  • * – 毎月
  • 1-5 – 月曜〜金曜(すべての平日)

4. Crontabエントリを確認する方法

現在ログインしているユーザーのCrontabを表示

自分のcrontabエントリを確認するには、以下のように「crontab -l」コマンドを実行します。

ramesh@dev-db$ crontab -l
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
[注意: 現在ログイン中のユーザーのcrontabが表示されます]

RootユーザーのCrontabを表示

rootユーザーとしてログイン(su - root)し、「crontab -l」を実行します。

root@dev-db# crontab -l
no crontab for root

他のLinuxユーザーのCrontabを表示

他のユーザーのcrontabを確認するには、rootとしてログインし、-u {ユーザー名} -lオプションを使用します。

root@dev-db# crontab -u sathiya -l
@monthly /home/sathiya/monthly-backup
00 09-18 * * * /home/sathiya/check-db-status

5. Crontabエントリを編集する方法

現在ログインしているユーザーのCrontabを編集

crontabを編集するには「crontab -e」を使用します。デフォルトでは、現在ログイン中のユーザーのcrontabが開かれます。

ramesh@dev-db$ crontab -e
@yearly /home/ramesh/centos/bin/annual-maintenance
*/10 * * * * /home/ramesh/debian/bin/check-disk-space
~
"/tmp/crontab.XXXXyjWkHw" 2L, 83C
[注意: crontabファイルがVimエディタで開かれます。cronは一時ファイル/tmp/crontab.XX...を作成します]

一時ファイルを:wqで保存すると、crontabが保存され、正常に更新されたことを示す次のメッセージが表示されます。

~
"crontab.XXXXyjWkHw" 2L, 83C written
crontab: installing new crontab

RootユーザーのCrontabを編集

rootユーザーとしてログインし、「crontab -e」を実行します。

root@dev-db# crontab -e

他のLinuxユーザーのCrontabを編集

他のユーザーのcrontabを編集するには、rootとしてログインし、-u {ユーザー名} -eオプションを使用します。

root@dev-db# crontab -u sathiya -e
@monthly /home/sathiya/fedora/bin/monthly-backup
00 09-18 * * * /home/sathiya/ubuntu/bin/check-db-status
~
~
~
"/tmp/crontab.XXXXyjWkHw" 2L, 83C

6. 毎分ジョブをスケジュールする

実際には毎分ジョブが必要になることはまれですが、この例を理解しておくと、以降の例が格段にわかりやすくなります。

* * * * * CMD

「*」はすべての可能な値を意味します。つまり、一年中毎分実行されるということです。この「*」は、以下のようなケースで特に便利です。

  • 分フィールドに「*/5」と指定すると、5分ごとに実行されます。
  • 分フィールドに「0-10/2」と指定すると、最初の10分間は2分ごとに実行されます。
  • この記法は他の4つのフィールドでも同様に使用できます。

7. 10分ごとにバックグラウンドジョブをスケジュールする

10分ごとにディスク容量をチェックしたい場合は、次のように指定します。

*/10 * * * * /home/ramesh/check-disk-space

これにより、一年中10分ごとにcheck-disk-spaceコマンドが実行されます。ただし、勤務時間中だけ実行したい、あるいは逆に勤務時間外だけ実行したいといった要件が出てくることもあります。そのような場合の指定方法は、前述の例を参考にしてください。

また、5つのフィールドを個別に指定する代わりに、以下のようなキーワードを1つ指定するだけで済む特殊な書き方もあります。「@」に続けてキーワード(reboot、midnight、yearly、hourlyなど)を記述します。

キーワード同等の指定
@yearly0 0 1 1 *
@daily0 0 * * *
@hourly0 * * * *
@reboot起動時に実行

8. @yearlyで毎年の最初の1分にジョブを実行する

毎年の最初の1分にジョブを実行したい場合は、@yearlyキーワードを使用します。以下の例では、毎年1月1日の00:00にannual-maintenanceシェルスクリプトによるシステム年次メンテナンスが実行されます。

@yearly /home/ramesh/red-hat/bin/annual-maintenance

9. @monthlyで毎月月初にCronジョブを実行する

@yearlyと同様の考え方で、@monthlyキーワードを使うと月に1回コマンドを実行できます。以下の例では、毎月1日の00:00にtape-backupシェルスクリプトが実行されます。

@monthly /home/ramesh/suse/bin/tape-backup

10. @dailyで毎日バックグラウンドジョブを実行する

@dailyキーワードを使用すると、毎日00:00にcleanup-logsシェルスクリプトによるログファイルのクリーンアップが実行されます。

@daily /home/ramesh/arch-linux/bin/cleanup-logs "day started"

11. @rebootで再起動のたびにコマンドを実行する方法

@rebootキーワードを使用すると、マシンが起動するたびに、指定したコマンドが一度だけ実行されます。

@reboot CMD

12. MAILキーワードでCrontabのメール出力を無効化・転送する方法

デフォルトでは、crontabのジョブ出力はジョブを登録したユーザーにメールで送信されます。出力を特定のユーザーに転送したい場合は、crontab内のMAIL変数を追加または更新します。

ramesh@dev-db$ crontab -l
MAIL="ramesh"
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
[注意: MAIL変数を含む現在のユーザーのcrontab]

逆に、どこにもメールを送信したくない場合、つまりcrontabの出力のメール送信を停止したい場合は、次のようにMAIL変数を空にします。

MAIL=""

13. LinuxのCronジョブを毎秒実行することはできる?

結論から言うと、毎秒実行のcronジョブはスケジュールできません。cronで指定できる最小単位は「分」だからです。そもそも通常の運用において、毎秒何らかのジョブを実行する必要があるケースはほとんどありません。

14. CrontabでPATH変数を指定する

ここまでの例では、実行するLinuxコマンドやシェルスクリプトを絶対パスで指定してきました。

たとえば、/home/ramesh/tape-backupと記述する代わりにtape-backupというコマンド名だけで指定したい場合は、次のようにcrontabのPATH変数に/home/rameshを追加します。

ramesh@dev-db$ crontab -l
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/ramesh
@yearly annual-maintenance
*/10 * * * * check-disk-space
[注意: PATH変数を含む現在のユーザーのcrontab]

15. CronファイルからCrontabをインストールする

crontabファイルを直接編集する代わりに、まずすべてのエントリをcronファイルにまとめておくこともできます。エントリをファイルに記述したら、それをcronへアップロード(インストール)します。

ramesh@dev-db$ crontab -l
no crontab for ramesh
$ cat cron-file.txt
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space
ramesh@dev-db$ crontab cron-file.txt
ramesh@dev-db$ crontab -l
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space

注意: この操作によりcron-file.txtの内容がcrontabにインストールされ、それまでの古いcronエントリは削除されます。cronファイルからエントリをアップロードする際は、十分注意してください。

関連するCronチュートリアル

  • CronとAnacronの違い:LinuxでAnacronを設定する方法(実例付き)
  • Cronを5分ごと・毎秒・毎時・毎日・毎月に実行する方法
  • Linux Crontabコマンドの6つの使用例
  • バッチモードでCronジョブをインストール・編集・削除する方法
  • at、atq、atrm、batchコマンドを9つの例で理解する

おすすめのLinux関連記事

以下の「15の実例」シリーズ記事も参考になるでしょう。

  • 見つけたぞ!− 実践的Linux findコマンド15選
  • Linuxコマンドライン履歴を極める15の例
  • Unix lsコマンド:実践的な15の使用例
  • grepを使いこなせ!− 実践的grepコマンド15選
  1. Windows 10にBash(Linuxシェル)をインストールして使う方法【WSL完全ガイド】

    Windows上でLinuxシェルをセットアップして使う方法を、Windows Subsystem for Linux(WSL)を使って解説します。 このチュートリアルは、2020年以降にリリースされた最新版のWindows 10を対象としています。古いバージョンのWindows 10でのWSLの使い方や、Windows 8/7/XP向けの別の方法については扱いません。サポートが終了したソフトウェアの使用は避けるべきだからです。どうしてもWindowsを使わなければならない場合は、必ずセキュリティ更新プログラムが提供されているバージョンを使用してください。 WSLは非常に優れたツールで、まるで

  2. Linuxシェルスクリプトで配列を操作する方法 – パート8

    配列という概念がないプログラミング言語は考えられません。実装方法は言語ごとに異なりますが、配列は類似したデータも異なるデータも、ひとつのシンボリックな名前のもとにまとめて管理できる強力な仕組みです。 本記事はシリーズ第8回として、シェルスクリプトにおける配列の使い方を、実際に動かせるサンプルスクリプトとともにわかりやすく解説します。 配列の初期化と使い方 最近のバージョンのbashは1次元配列をサポートしています。配列はシェル組み込みコマンドのdeclareを使って明示的に宣言できます。 declare -a var ただし、必ずしも上記のように宣言する必要はありません。次のように、個々の要素