Linux

【Linux】cronの使い方を徹底解説!!『自動化』

Linuxのcronは、定期的にタスクを実行するための非常に強力なツールです。このツールを使うと、ユーザーは簡単に特定のタイミングでスクリプトやコマンドを実行できます。ここでは、Red Hat系(CentOSやFedoraなど)とDebian系(Ubuntuなど)のLinuxディストリビューションにおけるcronの基本的な使い方と構成方法について解説します。

さらに、cronの設定ファイルの構造や構文、cronジョブの例、cronのログの確認方法など、より詳細な内容も解説します。また、cronを使用する際の注意点やトラブルシューティングの方法も紹介します。

最後に、cronを使用してバックアップの自動化や定期的なメンテナンスタスクの実行など、実用的な用途についても具体的な例を挙げながら解説します。

この記事を読むことで、Linuxシステムでのcronの使い方や設定方法を理解し、定期的なタスクの自動化を効果的に行うことができるようになるでしょう。

cronの概要

cronは、Unix系オペレーティングシステムで定期的なジョブのスケジュール管理を行うデーモンプロセスです。cronは通常、各ユーザーのcronテーブルに定義されたスケジュールに基づいてジョブを実行します。これらのジョブは、スクリプト、コマンド、プログラムなどの形式で指定されることが一般的です。

cronの設定方法

ターミナルで以下のコマンドを実行します。

crontab -e

viエディタが立ち上がるので、以下のルールに従って記述します。

分 時 日 月 曜日 ユーザー名 コマンド
*  *  *  *  * root some_command
指定対象 指定範囲
0〜59
0〜23
1〜31
1〜12 または jan〜dec
曜日 0〜7 または sun〜sat

cronの設定サンプル

# 1分ごと
* * * * * root touch /home/ubuntu/test.txt

# 1:00〜1:59まで1分ずつ実行
* 1 * * * root touch /home/ubuntu/test.txt

# 毎日1:00に実行
0 1 * * * root touch /home/ubuntu/test.txt

# 毎月12日~20日00:00に実行
0 0 12-20 * * root touch /home/ubuntu/test.txt

# 毎週月曜日〜金曜日00:00に実行
0 0 * * 1-5 root touch /home/ubuntu/test.txt

crontabコマンドの使い方とオプション

使用方法は次のようになります。

crontab [-u user] file
crontab [-u user] { -l | -r | -e }

オプションそれぞれについて説明します。

-u: ユーザ名の指定

crontabを調整するユーザを指定します。
未指定の場合は、実行中ユーザ のcrontabを調整します。

注意

suコマンド中にcrontabを実行するとどのユーザで実行するか不安定になるため、安全のために-uオプションが必要です。

-l: 現在のスケジュールを確認

-lオプションをつけることで、現在ロードされてるcrontabファイルを確認できます。

$ crontab -l
<strong>*</strong>/10 5-22 <strong>*</strong> <strong>*</strong> 1-5 ~/cron/sh/hoge.sh

-r: 現在のスケジュールを全て削除

-rオプションをつけることで、crontabファイルを削除します。

次のシェルは実際にcrontabファイルを削除したあとに確認してます。

$ crontab -l
<strong>*</strong>/10 5-22 <strong>*</strong> <strong>*</strong> 1-5 ~/cron/sh/hoge.sh
$ crontab -r
$ crontab -l
crontab: no crontab <strong>for </strong>mothule

-e: 現在のスケジュールを編集

-eオプションをつけることで、スケジュールを編集します。
VISUAL環境変数またはEDITOR環境変数で指定されたエディタアプリで編集します。
エディタ終了すると自動的に適用されます。

次のシェルは空の状態から新しくスケジュールを登録してます。

$ crontab -e
crontab: no crontab <strong>for </strong>mothule - using an empty one
crontab: installing new crontab

crontabの実行権限を制御

crontabは定期実行のスケジュールを編集できるコマンドです。
実行されるコマンドによっては重要な処理だったりします。
誰でも編集できる状態だと、悪意なくとも人為的なミスが起きるリスクが存在し続けます。

このリスクヘッジとして、cron.allowとcron.denyを使うことでcrontabの実行権限を制御できます。

cron.allowcron.denyファイルはそれぞれ、/usr/lib/cron/cron.allow/usr/lib/cron/cron.denyとして配置することで有効化されます。

それぞれの中身は行ごとに1ユーザーの名前が並びます。
cron.allowファイルが存在する場合は、その中に記載されたユーザーのみが使えます。つまりホワイトリストです。
cron.denyファイルが存在する場合は、その中に記載されたユーザーは使えません。つまりブラックリストです。

cronの設定ファイル

「/etc/crontab」

通常、このファイルには、以下のように、「cron.monthly」、「cron.weekly」、「cron.daily」、「cron.hourly」配下のファイルが、指定時間ごとに実行されるように設定されています。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg

このファイルも、「/var/spool/cron/user」ファイルと同様に、コメント行、環境変数の設定、cronコマンドの実行の3つで形成されますが、cronコマンドの実行を設定する行の書式が若干異なっています。

/etc/
├── cron.d
│   ├── anacron
├── cron.daily
├── cron.hourly
├── cron.monthly
├── crontab
├── cron.weekly

Linuxでは、crontabを直接編集することは推奨されていないため、定期的に実行したいコマンドについては「cron.monthly」、「cron.weekly」、「cron.daily」、「cron.hourly」配下のファイル、または、crontabコマンドを用いて、「/var/spool/cron/user」ファイルに設定を行ないます。

cron.d

このフォルダに入った拡張子のないファイルが実行されます。
普段はこちらのフォルダ内にファイルを作成して操作を行います

cron.***

こちらは、日ごと、時間ごと、月ごと、など、
実行しやすいように既に作成されています。この中に実行ファイルを入れれば実行できますが、
ファイルが膨大にならない限りcron.dに個人で作成したほうが楽かもしれません

crontab

このファイルはcronの一番メインのファイルです。
こちらに記載しても動きますが、このファイルの形式を元に動かすことになるので、
編集する際はしっかりバックアップをとっておくことをおすすめします。

cronの注意点

  • cronジョブの定義では、スペースで区切られた5つのフィールドが必要です。これらのフィールドは、定期的に実行されるジョブのスケジュールを定義します。
  • ジョブのパスが通っていることを確認してください。特に、スクリプトを実行する場合は、スクリプトが実行可能な場所に配置されていることを確認してください。
  • スクリプトの実行権限にも注意して下さい。

cronの便利な設定方法

cronの便利な使い方や細かなオプションについて、サンプルを交えて説明します。

ワイルドカードの使用

cronでは、ワイルドカード(*)を使用して、複数の値を指定できます。たとえば、*を使用すると、そのフィールドのすべての値に一致します。例えば、*を使用すると、毎分、毎時、毎日、毎月、毎週曜日などにジョブを実行できます。

毎日午前3時にジョブを実行する場合は、以下のように設定します。

0 3 * * * /path/to/command

複数の値の指定

カンマ(,)を使用して複数の値を指定できます。たとえば、2,5,8のように指定すると、指定した値に対応する時間にジョブが実行されます。

月曜日と金曜日の午後5時にジョブを実行する場合は、以下のように設定します。

0 17 * * 1,5 /path/to/command

範囲の指定

ハイフン(-)を使用して範囲を指定できます。たとえば、1-5のように指定すると、1から5までの値に対応する時間にジョブが実行されます。

10日から15日までの間でジョブを実行する場合は、以下のように設定します。

0 0 10-15 * * /path/to/command

スラッシュの使用

スラッシュ(/)を使用して、指定された間隔でジョブを実行できます。たとえば、*/10を使用すると、10分ごとにジョブが実行されます。

10分おきにジョブを実行する場合は、以下のように設定します。

*/10 * * * * /path/to/command

特定の日付や曜日の指定

特定の日付や曜日にジョブを実行する場合は、日付フィールドや曜日フィールドに値を指定します。たとえば、月曜日にジョブを実行する場合は、0または7を指定します。日付は1から31の範囲で指定します。

毎月1日にジョブを実行する場合は、以下のように設定します。

0 0 1 * * /path/to/command

ジョブの実行結果のメール送信

cronジョブの実行結果をメールで受け取りたい場合は、MAILTO環境変数を使用して、実行結果を指定したメールアドレスに送信できます。

ジョブの実行結果を毎日午前6時にメールで受け取りたい場合は、以下のように設定します。

MAILTO=user@example.com
0 6 * * * /path/to/command

ジョブのログの出力

ジョブの実行ログを記録するために、cronジョブに対して出力ファイルを指定できます。これにより、ジョブの実行結果やエラーメッセージを後で確認できます。

ジョブの実行ログを毎月1日にログファイルに出力する場合は、以下のように設定します。

0 0 1 * * /path/to/command >> /var/log/cron.log 2>&1

ジョブの一時停止

特定の期間ジョブを一時停止したい場合は、cronジョブの行をコメントアウトするか、ジョブを無効にする方法があります。コメントアウトすることで、ジョブが無効になり、実行されません。

# 0 3 * * * /path/to/command

月末日のみジョブを実行

testコマンドとdateコマンドを組み合わせることで、月末日にジョブを実行する方法があります。以下がその方法を使ったサンプルです。

0 0 28-31 * * [ $(date +\%d -d "tomorrow") = "01" ] && [your_command]

このcronジョブは、月の28日から31日の間で、翌日が1日である場合に your_command を実行します。

具体的な例を挙げると、毎月の最終日に /usr/bin/backup.sh スクリプトを実行する場合、以下のようなcronジョブを作成します。

0 0 28-31 * * [ $(date +\%d -d "tomorrow") = "01" ] && /usr/bin/backup.sh

このジョブは、毎月の最終日に午前0時に /usr/bin/backup.sh スクリプトを実行します。

この方法を使うと、月の日数に関係なく月末日にジョブを実行することができます。

cronの活用事例

  1. バックアップのスケジューリング: データベースやファイルシステムのバックアップを自動化するためにcronを使用します。例えば、毎週日曜日の午後11時にバックアップスクリプトを実行するように設定します。
  2. システムのメンテナンス: システムの定期的なメンテナンスタスクをcronでスケジューリングします。これには、ログのローテーション、一時ファイルのクリーンアップ、キャッシュの削除などが含まれます。
  3. セキュリティアップデートの適用: システムのセキュリティを維持するために、cronを使用して定期的にセキュリティアップデートを適用することがあります。このようなジョブは通常、月曜日の午前2時など、トラフィックが少ない時間帯にスケジュールされます。
  4. レポートの自動生成: ビジネスや運用管理のためのレポートを自動的に生成するためにcronを使用します。例えば、毎月最終日の午後5時に売上レポートを生成するスクリプトを実行するように設定します。
  5. ウェブサイトの監視: ウェブサイトの可用性を監視するために、cronを使用して定期的にウェブリクエストを送信し、レスポンスをチェックすることがあります。障害が発生した場合、自動的に通知が送信されるように設定します。

例としてウェブサイトの監視のためのサンプルcronジョブは次の様に実装します。このジョブは、指定したURLに定期的にGETリクエストを送信し、レスポンスをチェックします。もしウェブサイトが正常に応答しない場合、エラーがログに記録されます。

まずシェルスクリプトを作り、実行権を付与します。ここでは「website_monitor.sh」として保存しました。

# ウェブサイトの監視用のcronジョブ

# cronのログファイルの場所を指定
LOG_FILE="/var/log/website_monitor.log"

# 監視するウェブサイトのURL
WEBSITE_URL="https://example.com"

# リクエストの送信
response=$(curl -s -o /dev/null -w "%{http_code}" $WEBSITE_URL)

# HTTPステータスコードをチェック
if [ "$response" != "200" ]; then
    # エラーメッセージをログに書き込む
    echo "$(date +'%Y-%m-%d %H:%M:%S') - ウェブサイト $WEBSITE_URL が正常に応答しませんでした。HTTPステータスコード: $response" >> $LOG_FILE
    # 通知を送信する
    # ここに通知の処理を追加する
fi

crontabを開き設定を追記します。

# cronジョブの設定ファイルを開く
crontab -e
# ウェブサイトの監視用cronジョブ
*/5 * * * * /bin/bash /path/to/website_monitor.sh

これにより、ウェブサイトの監視用のcronジョブが毎時5分ごとに実行されます。ジョブが実行されるたびに、ウェブサイトへのリクエストが送信され、ステータスコードがチェックされます。

これらの事例は、cronが様々な用途で活用されていることを示しています。重要なタスクを自動化し、効率的に運用するために、cronの柔軟な機能を活用することが重要です。

Red Hat系とDebian系でのcronの違い

Red Hat系(CentOSやFedoraなど)とDebian系(Ubuntuなど)の間には、cronの機能や設定方法にわずかな違いがありますが、基本的な使い方は同じです。主な違いは以下の通りです。

  1. cronデーモンの名称: Red Hat系では crond、Debian系では cron という名称でデーモンが稼働していますが、機能的にはほぼ同じです。
  2. cronジョブの設定ファイルの場所: Red Hat系では /etc/crontab/etc/cron.d/ にジョブを設定することが一般的です。一方、Debian系では /etc/crontab/etc/cron.d/ の他に、ユーザーごとのcronジョブを /var/spool/cron/crontabs/ ディレクトリに保存することもあります。
  3. cronジョブのスケジュールフォーマット: 両方のディストリビューションで、cronジョブのスケジュールは同じ形式を使用します。これは分、時、日、月、曜日の順に指定されます。
  4. システムのcronジョブとユーザーのcronジョブ: 両方のディストリビューションでは、システム全体のcronジョブを設定することができますが、Debian系では各ユーザーが独自のcronジョブを設定することもできます。

基本的には、cronの使い方や設定方法はどちらのディストリビューションでもほぼ同じですが、上記のようなわずかな違いがあります。

まとめ

この記事では、Linuxのcronについて詳しく解説しました。cronは、定期的なタスクのスケジュール管理に使用される強力なツールであり、Debian系とRed Hat系のLinuxディストリビューションで使用することができます。

Debian系のLinuxディストリビューションでは、crontab -eコマンドを使用してユーザーのcronテーブルにジョブを追加します。ジョブのフォーマットは分、時、日、月、曜日の5つのフィールドからなり、それぞれで実行するタイミングを指定します。

Red Hat系のLinuxディストリビューションでも同様にcrontab -eコマンドを使用してユーザーのcronテーブルにジョブを追加しますが、ユーザーのcronテーブルが/var/spool/cronディレクトリに保存されます。

ジョブを追加した後は、cronデーモンが自動的にジョブを読み込み、指定されたタイミングでジョブを実行します。ジョブの定義には注意が必要で、スペースで区切られた5つのフィールドが必要です。

この記事を参考にすることで、Linuxのcronを使ってタスクをスケジュールする方法を理解することができます。