【定型作業の自動化】cronの使い方とジョブ登録のまとめ

2022-05-26

バックアップや定期的なデータ送信など、定型作業は自動化してPCにお任せしたいと思いますよね。PCの自動化はWindowsだと「タスクスケジューラ」、Linuxでは「cron:クーロン」が使われる事が多いです。

今回、cronで簡単なスクリプトを実行させたいと思い、改めてcronの使い方とジョブの登録方法をまとめました。環境はUbuntu Server 20.04を使っています。

cronの特徴

  • 指定したスケジュール(日時・曜日・時・分で時間指定)にジョブを実行する。
  • 指定した時刻に実行できなかった場合は次回のスケジュールまで実行されない。
  • crondプロセスが常駐する。
  • 一般ユーザーでもジョブを登録できる。
  • ジョブ登録の方法が複数ある

一般ユーザーでもジョブの登録ができるため、root権限の無いサーバーでも自動化できるのがcronの利点です。

ただ、何らかの理由(サーバーシャットダウン等)で指定した日時にジョブの実行ができなかった場合は、次回のスケジュールまで待たないといけません。

また、複数の方法でジョブの登録ができる上に方法によって少しずつ作法が違うので、慣れるまで戸惑う場合があります(そのため、この記事を作りました)。

ジョブの登録方法

ジョブ設定ファイル

以下の表すべてがcronのジョブ設定ファイルを置くディレクトリ、設定ファイルになります。crondは、定期的に設定ファイルの内容に変更がないかを確認し、変更があった場合に実行します。

Noディレクトリ名ユーザー説明
1/var/spool/cron/crontabs全ユーザユーザ毎のジョブ設定ファイル
2/etc/crontab(設定ファイル)root基本のジョブ設定ファイル
3/etc/cron.hourlyroot毎時実行されるジョブ設定ファイルを置くディレクトリ
4/etc/cron.dailyroot毎日実行されるジョブ設定ファイルを置くディレクトリ
5/etc/cron.monthlyroot毎月実行されるジョブ設定ファイルを置くディレクトリ
6/etc/cron.weeklyroot毎週実行されるジョブ設定ファイルを置くディレクトリ
7/etc/cron.droot上記以外のジョブ設定ファイルを置くディレクトリ

設定ファイルの書式

基本の書式(2. /etc/crontab、7. /etc/cron.d以外)

テキストファイルに左から「分」「時」「日」「月」「曜日」を指定し、実行したいコマンドを記述します。

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * [実行コマンド]

2. /etc/crontab、7. /etc/cron.dの場合

後述しますが実行ユーザーを指定することができるため、コマンドの前にユーザー名の入力が必要です。

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

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

1. /var/spool/cron/crontabsに登録

特徴:ユーザー毎のジョブ設定ファイルが登録される。

登録方法:登録したいユーザーでコマンド「$crontab -e」を実行。基本の設定に準じて実行したいジョブを登録。

備考:rootで「#crontab -e」を実行した場合は、/var/spool/cron/crontabs/rootで設定ファイルが作成される。

2. /etc/crontabに登録

特徴:編集はrootのみ。実行ユーザーを指定してジョブの実行ができる。

登録方法:エディタで/etc/crontabを直接編集。

備考:編集しただけでは登録されないため、crondの再起動が必要。

3.~6. /etc/cron.hourly~/etc/cron.weeklyに登録

特徴:必要なジョブの実行スケジュールに応じて、設定ファイルを分離できる。

登録方法:設定ファイルを作成して指定したディレクトリに保存。

備考:ファイルの所有者はroot、パーミッションは755(rwxr-xr-x)にしないと実行されない。

7. /etc/cron.dに登録

特徴:3.~6.以外の指定方法でジョブの実行ができる(10分毎など)。1.や2.でも指定できるが、設定ファイルを個別に作成できるのでわかりやすい(?)。こちらも、実行ユーザーを指定してジョブの実行ができる。

登録方法:設定ファイルを作成して指定したディレクトリに保存。

備考:ファイルの所有者はroot、パーミッションは644(rw-r–r–)で保存(実行権限は必要なし)。

まとめ

どの方法でジョブを登録するかでパーミッションの設定が微妙に違っていたり、ユーザーの指定が必要になったりで最初はとても迷いました。

root権限が無いサーバーの場合は「$crontab -e」一択なのでわかりやすくなりますが、自宅サーバーでroot権限を使えるとどの方法がベストなのか…。

一覧にすると少しわかりやすくなったかな?と思います。

IT-Tips

Posted by ううら