2019/09/13更新

cronの日時指定を、基礎から学ぶ(分,時,日,月,曜日の指定、◯分ごと、月末起動、など)

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
今日は、cronの時間指定について基礎〜応用まで、ブログに書きたいと思います。



目次




cronの基本

cronは「* * * * *」の5箇所を指定して、起動時間を設定します。左から「分」「時」「日」「月」「曜日」を指定します。
# cronの起動時間設定
* * * * * (起動したい処理)
| | | | |
| | | | |- 曜日
| | | |--- 月
| | |----- 日
| |------- 時
|--------- 分
上記5箇所に値を設定することで、様々なタイミングで処理を起動できます。



起動時間の書き方(基本編)

ここではまず、基本的な時間指定の方法を見ていきたいと思います。

1分毎に起動する

すべての箇所に*を指定した場合、1分毎に処理が起動されます。
# 1分毎に起動する
* * * * * echo 'hello'

毎時◯分に起動する

「分」に数字を指定すると、毎時◯分で処理を起動できます。
# 毎時0分
0 * * * * echo 'hello'

# 毎時10分
10 * * * * echo 'hello'
また、カンマ区切りで複数指定したり、ハイフンを用いて範囲指定もできます。
# 毎時10分と30分(カンマで複数指定も可)
10,30 * * * * echo 'hello'

# 毎時00〜10分に、1分毎に起動(ハイフンで範囲指定も可)
0-10 * * * * echo 'hello'

毎日◯時に起動する

「時」「分」の2箇所を指定すると、日次(Daily)で起動できます。
# 毎日1時00分
0 1 * * * echo 'hello'

# 毎日1時と3時に、00分に起動(カンマで複数指定も可)
0 1,3 * * * echo 'hello'

# 毎日1時〜6時まで、00分に起動(ハイフンで範囲指定も可)
0 1-6 * * * echo 'hello'
1つ注意するべきことは、分を「*」にした場合、指定した時間(1時など)に1分毎に処理が起動してしまいます。
# 毎日1時台に1分ごとに起動してしまう(00分起動の設定と間違えやすい・・)
* 1 * * * echo 'hello'
上記は意図しない設定のことが多いので、注意が必要です。

毎月◯日に起動する

「日」「時」「分」の3箇所を指定すると、月次(Monthly)で起動できます。
# 毎月3日の4:10に起動
10 4 3 * * echo 'hello'

# 毎月3日と13日の、4:10に起動(カンマで複数指定も可)
10 4 3,13 * * echo 'hello'

# 毎月3〜5日の4:10に起動(ハイフンで範囲指定も可)
10 4 3-5 * * echo 'hello'

毎週◯曜日に起動する

「曜日」「時」「分」を指定すると、週次(Weekly)で起動ができます。
曜日には「0:日曜日 〜 6:土曜日」を指定します。
# 毎週月曜日の午前10:00に起動
0 10 * * 1 echo 'hello'

# 毎週月,水曜日の午前10:00に起動(カンマで複数指定も可)
0 10 * * 1,3 echo 'hello'

# 毎週月〜金曜日の午前10:00に起動(ハイフンで範囲指定も可)
0 10 * * 1-5 echo 'hello'

毎年◯月◯日に起動する

年に1度しか動かない処理は少し怖いですが、「月」「日」「時」「分」を指定すると、年次(Yearly)で起動できます。
# 毎年1月3日の10:00に起動
0 10 3 1 * echo 'hello'



起動時間の書き方(応用編)

基本編の記述ができれば、ほとんどの要件に対応できますが、cronでは下記のような設定も可能です。

10分ごとや2時間ごとに起動する

時間指定で「*/10」のような指定をすると、10分毎、2時間毎、1日おき、などの指定が可能です。
# 10分ごとに起動する
*/10 * * * * echo 'hello'

# 2時間ごとに起動する(0時、2時、4時、...)
0 */2 * * * echo 'hello'

# 2時間ごとに起動する(1時、3時、5時、...)
0 1-23/2 * * * echo 'hello'

# 1日おきに起動する
0 0 */2 * * echo 'hello'

月初に起動したい

月次(Monthly)指定で、「1日」を指定すると月初に起動できます。
# 月初の午前2:00に起動
0 2 1 * * echo 'hello'

月末に起動したい

cronでは、月末を指定できません。月末が28日なのか、31日なのか、カレンダーによるからです。月末に処理を起動したい場合、下記のロジックで処理を行います。

28〜31日に処理を起動し、翌日が1日であるかをチェックし、それがTrueの場合には処理を行う。

上記ロジックをcronで記述すると、下記となります。
# 月末の00:00に処理を起動(翌日が1日かをチェックして、trueなら、処理を実行する)
0 0 28-31 * * /usr/bin/test $(date -d '+1 day' +%d) -eq 1 && [実行したいコマンド]
/usr/bin/test」のパスと、「date -d '+1 day' +%d」の書き方は、Linuxの種類により異なる場合があります。動かなかったら調整してください。



最後に

今日はcronのいろいろな書き方をまとめました。cronを使うことは多いですが、僕はなんとなく使っていた派でした。ちゃんと学んでみよう〜と思い、今回のブログを書きました。

最後になりますが本ブログでは、サーバー、Python、フロントエンド、インフラ、PHP、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時の、解決の糸口に!」そんな目標でブログを書き続けています。ぜひ、本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

[Web] JavaScriptは使わずツールチップを表示する
[Tool] Web上で数式を簡単に表現するためのツールを作ってみました。Google先生に感謝☆
[セミナー] Frontrendというセミナーに参加してきました(フロント開発のフレームワークやツール編)
[Tool] Codekitというツールを使うと、HTML/JS/CSS編集してファイル保存の度に、ブラウザに差分が自動的に反映される
[Web] MacでWebアプリ開発するなら使いたい。無料で簡単に画像サイズを減らすことができる3つのツール
[パフォーマンス] サイトのパフォーマンス問題を発見できるYSlowというツールを使ってみた。指標の内容一覧など。
[Tool] JPGファイルをコマンドラインで圧縮するツールが便利!
RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。