Linuxのcronでジョブを設定してタスクを自動実行する方法
目標
- cronでジョブを設定して任意のタスクを指定した時間に実行する。
目次
1. cronとは
- crontabファイルでスケジュールされたタスクを起動するためのデーモン(Windowsのタスクスケジューラに近い)のこと。
- 以下のファイルに実行したいプログラムやシェルスクリプトなどの実行日時を記述します。このファイルをcrontabファイルと呼びます。
/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]
- 本手順では、/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.sh3. crontabコマンド
- crontabファイルに設定を記述するにはcrontabコマンドを使用します。書式は以下のとおりです。
$ crontab [ -u ユーザ名 ] { -l | -r | -e } [-i]- crontabコマンドのオプションは以下のとおりです。
-u : 操作するcrontabファイルのユーザーを指定する (rootユーザのみ実行可能)。
-l : crontabファイルの内容を表示する。
-r : crontabファイルを削除する。
-e : crontabファイルを編集する。通常はviエディタが起動する。
-i : -rオプションと同時に使用すると削除の確認メッセージが表示がされ、「y」か「Y」キーを押下することでcrontabファイルが削除される。環境によっては使用できない場合がある。- 誤って「-r」オプションを入力してしまった際に、crontabファイルが削除されてしまうことを防ぐには次の方法があります。
・crontabの「-i」オプションをaliasとして設定し、「-r」を誤って指定しても確認メッセージを表示させる。
※環境によっては「-i」オプションが使用できない場合があるので、使用できない場合は以下の手順はスキップしてください。
- 「/etc/bashrc」にaliasを記述し、「-r」オプション実行時に削除確認のメッセージを表示させる設定を行います。
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. タスクの登録
- crontabコマンドを用いて、指定した時間にコマンドが実行されるように設定を行います。
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. タスクが実行されない場合の対処法
- crontabコマンドを用いてタスクが任意の時間に実行されるように設定を行ったが、指定の時間になってもタスクが実行されない場合は以下を試してください。各手順を実施した後に、指定した時間にタスクが実行されているかを再度確認してください。
- cronの動作に問題がないかチェックします。
正常に起動している場合。
$ /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ファイルの内容に問題がないかチェックします。
「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- cronのログには実行ログしか残らないため、エラーが発生してもログには何も出力されないので、crontabファイルで指定したコマンドの標準エラー出力を別途ファイルに出力するよう設定を行います。
$ 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の内容を確認し、エラーが出力されている場合は適切な対応を行います。
以上で全ての手順は完了になります