N-LAB

Linuxのcronでジョブを設定してタスクを自動実行する方法


目標


目次

  1. cronとは
  2. crontabファイルの設定確認
  3. crontabコマンド
  4. タスクの登録
  5. タスクが実行されない場合の対処法


1. cronとは


/etc/crontab
/var/spool/cron/crontabs/[User]

/etc/crontab
 対象     : システム用。root権限で実行
 設定ファイル : /etc/crontab
 設定方法   : エディタで/etc/crontabを直接編集
 記述方法   : 分 時 日 月 曜日 実行ユーザー コマンド
 反映方法   : crondデーモンの再起動


/var/spool/cron/crontabs/[user]
 対象     : ユーザ用。各ユーザーで利用
 設定ファイル : /var/spool/cron/crontabs/[user]
 ※Macの場合は「/var/at/tabs」
 設定方法   : crontabコマンドで編集
 記述方法   : 分 時 日 月 曜日 コマンド
 反映方法   : crontabコマンドで編集後に自動で反映

rootユーザーで実行したい → /etc/crontab
rootユーザー以外のユーザーで実行したい → /var/spool/cron/crontabs/[user]


2. crontabファイルの設定確認

1. すでにcrontabファイルに設定が記述されているかを確認するために以下のコマンドを入力します。

$ crontab -l


2. crontabファイルに設定が記述されていない場合は以下が表示されます。

$ crontab -l
no crontab for {ユーザ}


3. crontabファイルに設定が記述されている場合は、crontabファイルに記述した内容がそのまま表示されます。以下は一例です。

$ crontab -l
10 02 * * * /home/user/somewhere/hoge.sh


3. crontabコマンド

$ crontab [ -u ユーザ名 ] { -l | -r | -e } [-i]


-u : 操作するcrontabファイルのユーザーを指定する (rootユーザのみ実行可能)。
-l : crontabファイルの内容を表示する。
-r : crontabファイルを削除する。
-e : crontabファイルを編集する。通常はviエディタが起動する。
-i : -rオプションと同時に使用すると削除の確認メッセージが表示がされ、「y」か「Y」キーを押下することでcrontabファイルが削除される。環境によっては使用できない場合がある。


・crontabの「-i」オプションをaliasとして設定し、「-r」を誤って指定しても確認メッセージを表示させる。
※環境によっては「-i」オプションが使用できない場合があるので、使用できない場合は以下の手順はスキップしてください。

1. 以下のコマンドを入力し、viエディタを起動します。

$ sudo vi /etc/bashrc


2. 以下の内容を記載し、上書き保存します。

alias crontab="crontab -i"


3. 設定を反映させるために以下のコマンドを入力します。

$ source /etc/bashrc


4. 以下のコマンドを入力し、確認メッセージが表示されることを確認します。

$ crontab -r
crontab: really delete hoge's crontab? (y/n)


4. タスクの登録


1. 以下のコマンドを入力するとviエディタが起動するので設定したい内容を記述していきます。

$ crontab -e


2. 例として、毎日2時10分に指定のシェルスクリプトを起動したい場合は以下の内容を記述します。

10 02 * * * /home/user/somewhere/hoge.sh

※crontabファイルに書き込む内容の書式は以下になります。

# (行頭の # マークはコメント行を示す)
# アスタリスクは任意の値であり、数字を指定すればその時間に実行される
# 0 * * * * は毎時0分を指定
# 0 0 * * * は毎日0時0分を指定
# 0 0 1 1 * は毎年1月1日0時0分を指定
# +------------ 分 (0 - 59)
# | +---------- 時 (0 - 23)
# | | +-------- 日 (1 - 31)
# | | | +------ 月 (1 - 12)
# | | | | +---- 曜日 (0 - 6) (日曜日=0)
# | | | | |
# * * * * * 実行されるコマンド


3. cronに関するログは「/var/log/cron」に出力されるので、crontabファイルに設定した内容でタスクが実行されているかを確認します。

$ view /var/log/cron
XXX XX 02:10:01 ip-xxx-xxx-xxx-xxx CROND[12908]: (user) CMD (/home/user/somewhere/hoge.sh)

※2時10分に指定のシェルスクリプトが起動していることが確認できます。

4. OSによってcronのログの出力場所が異なるので以下を参照ください。

RHEL系      :  /var/log/cron
Debian/Ubuntu: /var/log/syslog
Solaris      : /var/cron/log
HP-UX        : /var/adm/cron/log
AIX          : /var/adm/cron/log

※ログには実行ログしか出力されず、エラー内容は出力されないので後述の「5. cronの設定が反映されない場合」で行う対策を実施する必要があります。
※Macの場合はデフォルトではlogを出力しないので、別途任意の場所にlogを出力するように設定を施す必要があります。

5. タスクが実行されない場合の対処法


正常に起動している場合。

$ /etc/rc.d/init.d/crond status
crond (pid  2653) is running...

停止している場合。

$ /etc/rc.d/init.d/crond status
crond is stopped

停止している場合は以下のコマンドでcronを再起動します。

$ sudo /etc/rc.d/init.d/crond restart
Starting crond:                                     [  OK  ]


「crontab -l」でcrontabファイルの内容を表示し、日時指定やコマンドのパスに誤りがないかを確認します。

$ crontab -l
10 02 * * * /home/user/somewhere/hoge.sh


シェルやPerlなどのファイルを実行する場合、ファイルに実行権のパーミッションの付与が必要なため、「ls」コマンドを使用して確認します。

$ ls -la /home/user/somewhere/hoge.sh
-rwx------ 1 user user 377 Mar 16 23:09 /home/user/somewhere/hoge.sh

実行権限が付与されていない場合は以下のコマンドを実行して権限を付与します。

$ sudo chmod 700 /home/user/somewhere/hoge.sh


$ crontab -e
# 標準出力をファイルに出力する場合
10 02 * * * /home/user/somewhere/hoge.sh 1> /var/log/hoge/exec.log

# 標準エラー出力をファイルに出力する場合
10 02 * * * /home/user/somewhere/hoge.sh 2> /var/log/hoge/error.log

# 標準出力とエラー出力を同じファイルに出力する場合
10 02 * * * /home/user/somewhere/hoge.sh > /var/log/hoge/both.log 2>&1

上記を設定後に、指定した時間(上記の例では2時10分)の経過を待ちます。経過後にerror.logまたはboth.logの内容を確認し、エラーが出力されている場合は適切な対応を行います。


以上で全ての手順は完了になります