Featured image of post 【自動化への第一歩】Cronのスケジューリング設定の書き方と使い方【crontab】

【自動化への第一歩】Cronのスケジューリング設定の書き方と使い方【crontab】

2595文字

Cronってよく聞くけどなんなんだろう

What’s?

皆さんはCron(クーロン)をご存知でしょうか?

サーバーサイド開発やインフラ管理をしている方はご存知だと思います。
これは、UnixやLinuxで多く使われるスケジューラーを設定/実行するためのプログラムの事です。

コマンドラインから、xx時になったらyyを実行してね、という命令を簡単に設定する事が出来るので、シェルスクリプトなどを定期実行する際によく多用されています。

Cronはスケジューリングの設定に専念

Cronを使って処理をスケジューリングすると、命令に従ってしっかりと処理を実行してくれます。
ただ、命令した以外の事はもちろん行わないので、細かい動きはシェルスクリプト内に記述するようにしてあくまで実行タイミングのスケジューリングのみをCronで行うようにしましょう。

Cronのスケジューリングで実行処理を設定するのは好ましくありません。

設定の癖が強いんじゃ!!

ただ、このCronですが実行タイミングを設定する際の設定がかなり癖が強いため、慣れていないとパッと設定するのがちょっと難しいです。
設定方法は分 時 日 月 曜日 実行コマンドの形式で指定する必要があります。

また、それぞれの項目に指定出来る値は以下のようになっています。

項目入力値
0~59
0~23
1~31
1~12
曜日0~7
※0,7=日曜、1=月曜、2=火曜...

また、それぞれの項目には以下のような値も設定をする事が可能です。

記号説明設定例
-範囲指定分フィールドに5-10とした場合は、5~10分の毎分にCronが実行される
*全範囲時フィールドに*とした場合は、毎時にCronが実行される
,複数指定分フィールドに1,3,5-10とした場合は、1,3,5分と10分までの毎分にCronが実行される
/間隔値指定分フィールドに5-10/2とした場合は、5~10分の間を2分間隔で実行し、*/5だと5分毎にCronが実行される

これらを多種多様に組み合わせてCronを設定する事になるので、慣れるまでは一瞬でスケジューリングを把握するのが難しいですね。。。

では、それを踏まえて実際にCronを使ってみましょう。

手順

準備

今回は以下のような、実行日時をlogファイルに追記していくとてもシンプルなシェルスクリプトを用意し、そちらをCronに設定して動かしてみようと思います。

実行日時書き込みスクリプト
#!/bin/sh

date >> /Users/{ユーザー名}/tmp/work/cron/cron_sample.log

スケジューリングを登録

今回は例として、1分毎に上位のシェルを実行するCronを設定してみましょう。
以下のコマンドでCronの編集エディタを開きましょう。

Cronの編集コマンド
crontab -e

すると、エディターが設定しているエディタが表示されるので、以下を追加して保存してください。

Cronの設定
* * * * * /Users/{ユーザー名}/tmp/work/cron/sample.sh
~
-- INSERT --

保存をすると以下のようなログが表示され、Cronの設定が完了します。

ログ
crontab: no crontab for {ユーザー名} - using an empty one
crontab: installing new crontab

ちなみに、すでにCronの設定がある場合は1行目が表示されません。

スケジューリングの確認

現在登録しているCronを確認するには以下のコマンドで確認出来ます。

Cron確認
crontab -l

crontab -eで登録した情報がリスト表示されます。

出力
* * * * * /Users/{ユーザー名}/tmp/work/cron/sample.sh
.
.
.

実行されないぞ。。。

1分待ってもログファイルが生成されません。

デフォルトでは、Cron実行時のエラーログ/var/mail/{ユーザー名}に追記されていきます。
今回の原因もそちらに記載されているはずなので、以下のコマンドで確認してみましょう。

command
cat /var/mail/{ユーザー名}

すると、以下のようなエラーが出力されていました。

ログ
From {ユーザー名}@xxx.xxx.xxx.xxx.static.zoot.jp  Tue Jun  5 00:29:02 2018
Return-Path: <{ユーザー名}@xxx.xxx.xxx.xxx.static.zoot.jp>
X-Original-To: {ユーザー名}
Delivered-To: {ユーザー名}@xxx.xxx.xxx.xxx.static.zoot.jp
Received: by xxx.xxx.xxx.xxx.static.zoot.jp (Postfix, from userid 501)
	id B0F0419E7A75; Tue,  5 Jun 2018 00:29:01 +0900 (JST)
From: {ユーザー名}@xxx.xxx.xxx.xxx.static.zoot.jp (Cron Daemon)
To: {ユーザー名}@xxx.xxx.xxx.xxx.static.zoot.jp
Subject: Cron <{ユーザー名}@xxx> /Users/{ユーザー名}/tmp/work/cron/sample.sh
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME={ユーザー名}>
X-Cron-Env: <USER={ユーザー名}>
X-Cron-Env: <HOME=/Users/{ユーザー名}>
Message-Id: <20180604152902.XXXXXXXXXX@xxx.xxx.xxx.xxx.static.zoot.jp>
Date: Tue,  5 Jun 2018 00:29:01 +0900 (JST)

/bin/sh: /Users/{ユーザー名}/tmp/work/cron/sample.sh: Permission denied

どうやら、シェルの実行権限が無いようです。
現在、このシェルスクリプトのファイルは644となっています。

コマンドからはsh /Users/{ユーザー名}/tmp/work/cron/sample.shで正常に実行出来たとしても、Cronから実行する場合はしっかりとファイル権限を変えないと動かないようですね。

ですので、以下のコマンドで実行権限を追加しましょう。

実行権限追加
chmod 744 /Users/{ユーザー名}/tmp/work/cron/sample.sh

確認

これで毎分ログファイルに実行日付が追記されていくようになったと思います。

cron_sample.log
Tue Jun  5 00:45:00 JST 2018
Tue Jun  5 00:46:00 JST 2018
Tue Jun  5 00:47:00 JST 2018
Tue Jun  5 00:48:00 JST 2018
Tue Jun  5 00:49:00 JST 2018

スケジューリングの削除

Cronで登録したスケジューリングは意図して消さない限り残り続けます。
ですので、そのまま残していると次の年に去年設定していたCronが動いて問題に!という事も十分ありえます。
Cronの削除はcrontab -eコマンドから削除する事が可能です。

また、一括して削除したい場合はcrontab -rでも可能です。

ただ、確認無しで全て消えてしまうので、使うときは気をつけましょう。

終わりに

以上のように、Cronを利用すればコマンドから簡単に定期実行処理を設定する事が可能です。

今まで手作業で定期実行していた部分を自動化する事が可能になるので、使いようによっては作業効率が格段にアップします。

また、スケジューリングの仕方もとても柔軟性が高いので、是非使いこなしてみてください。