Madogiwa Blog

主に技術系の学習メモに使っていきます。

cronの読み方をいつも忘れるので、いい感じにParseするgemを作ってみた💎

みなさん、こんにちは。まどぎわです(・∀・)
いつもcronの読み方を忘れてしまい検索して調べて、書くのが面倒くさかったので、いい感じにParseして表示してくれるgemを作って公開しました🙇‍♂️

cronとは?

cron とは、ジョブ(スクリプト)を自動実行するためのデーモンプロセスです。そして、Linux システムの管理を行なう場合、ログのローテートや、バックアップなど、定期的に自動実行したいジョブが数多くあります。
cron の設定ガイドから引用

下記のような形で実行時間を定義出来るやつです。例えば下記の場合、毎日7:00と23:00に実行されるような設定になります。

# 分 時 日 月 曜日
00 7,23 * * * 

でも数字と*で書かれていて、毎回どこがどこを表すのか忘れてしまう。。。

CronConfigParser

そういうわけで、いい感じにParseしてくれるgemを作ってみました💎✨

rubygems.org

👇リポジトリはこちら

github.com

使い方

基本的な使い方はこんな感じで、cronの設定をいい感じに確認することが出来ます🙌

CronConfigParser::Parser.call('00 5 * * * Asia/Tokyo')
=> #<CronConfigParser::CronConfig:0x00007fa4f492e820
 @days=["*"],
 @hours=["5"],
 @minutes=["00"],
 @months=["*"],
 @timezone="Asia/Tokyo",
 @wdays=["*"]>

また、返却されたobjectにminutes_configured?を実行すると、それが定義されているかどうかをチェックできます。(コードでcronを解析したいのような要件がない限りは、あんまり使い所はないかも😅)

# return false if configured nil or '*'
config = CronConfigParser::Parser.call('00 5 * * * Asia/Tokyo')
config.minutes_configured?
=> true
config.days_configured?
=> false

あとは、簡単なcronの設定の検証(必須、英字等が含まれていないかの構文チェック)を行うことが出来ます👮

# not configured require property.
CronConfigParser::Parser.call('00 5,13 * * ')
=> CronConfigParser::ConfigRequiredError

# configured invalid property.
CronConfigParser::Parser.call('00 5,a * * * Asia/Tokyo')
=> CronConfigParser::ConfigSyntaxError

validation: falseをつけることで検証を無効化することも出来ます👩‍🔧

CronConfigParser::Parser.call('00 5,a * * * Asia/Tokyo', validation: false)
=> #<CronConfigParser::CronConfig:0x00007fcedf09cdf0
 @days=["*"],
 @hours=["5", "a"],
 @minutes=["00"],
 @months=["*"],
 @timezone="Asia/Tokyo",
 @wdays=["*"]>

これから

今後は、次実行時間を教えてくれるCronConfig#next_execute_atとかを作って行こうかなと思っていますm( )m

これが出来ると、5時と10時ちょうどだけに実行したいときに* 5,10 * * *と定義してしまい、5時と10時に毎分実行されるような定義をしてしまう前に気づけるので、便利かなぁと。

おわりに

私みたいにcronの設定を毎回忘れちゃう人がいたら、よかったら使ってみてください🙇‍♂️