投稿日:
【自動化への第一歩】Cronのスケジューリング設定の書き方と使い方【crontab】
YouTubeも見てね♪
【最新機種】GoPro hero11 Black
最新機種でVlogの思い出を撮影しよう!
ペヤング ソースやきそば 120g×18個
とりあえず保存食として買っておけば間違いなし!
レッドブル エナジードリンク 250ml×24本
翼を授けよう!
モンスターエナジー 355ml×24本 [エナジードリンク]
脳を活性化させるにはこれ!
ドラゴンクエスト メタリックモンスターズギャラリー メタルキング
みんな大好き経験値の塊をデスクに常備しておこう!
BANDAI SPIRITS ULTIMAGEAR 遊戯王 千年パズル 1/1スケール
もう一人の僕を呼び覚ませ!!
サンディスク microSD 128GB
スマホからSwitchまで使える大容量MicroSDカード!
目次
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に設定して動かしてみようと思います。
1
2
3
|
#!/bin/sh
date >> /Users/{ユーザー名}/tmp/work/cron/cron_sample.log
|
スケジューリングを登録
今回は例として、1分毎に上位のシェルを実行するCronを設定してみましょう。
以下のコマンドでCronの編集エディタを開きましょう。
1 |
crontab -e
|
すると、エディターが設定しているエディタが表示されるので、以下を追加して保存してください。
1
2
3
|
* * * * * /Users/{ユーザー名}/tmp/work/cron/sample.sh
~
-- INSERT --
|
保存をすると以下のようなログが表示され、Cronの設定が完了します。
1
2
|
crontab: no crontab for {ユーザー名} - using an empty one
crontab: installing new crontab
|
ちなみに、すでにCronの設定がある場合は1行目が表示されません。
スケジューリングの確認
現在登録しているCronを確認するには以下のコマンドで確認出来ます。
1 |
crontab -l
|
crontab -e
で登録した情報がリスト表示されます。
1
2
3
4
|
* * * * * /Users/{ユーザー名}/tmp/work/cron/sample.sh
.
.
.
|
実行されないぞ。。。
1分待ってもログファイルが生成されません。
デフォルトでは、Cron実行時のエラーログは/var/mail/{ユーザー名}
に追記されていきます。
今回の原因もそちらに記載されているはずなので、以下のコマンドで確認してみましょう。
1 |
cat /var/mail/{ユーザー名}
|
すると、以下のようなエラーが出力されていました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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から実行する場合はしっかりとファイル権限を変えないと動かないようですね。
ですので、以下のコマンドで実行権限を追加しましょう。
1 |
chmod 744 /Users/{ユーザー名}/tmp/work/cron/sample.sh
|
確認
これで毎分ログファイルに実行日付が追記されていくようになったと思います。
1
2
3
4
5
|
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を利用すればコマンドから簡単に定期実行処理を設定する事が可能です。
今まで手作業で定期実行していた部分を自動化する事が可能になるので、使いようによっては作業効率が格段にアップします。
また、スケジューリングの仕方もとても柔軟性が高いので、是非使いこなしてみてください。