cronの動作についていろいろ検証してみた

# はじめに

今日、仕事絡みでcrontabを使用した実行タイミングについて思案していたところ、想像はできるけど確証はできない。
というわけで、ちゃんとデータで実証してみようと思いつき、試してみたので、参考にどうぞ

# 前提

* 今回の検証は分のみで行う
  * 時・日などは分のやりかたで応用できるため

# 検証方法

vagrantのVM上でcrontabを書き、2時間ぐらいほおっておいた

* UTC 5:40 〜 7:25 ぐらいまで
  * JST 14:40 〜 16:25

```
crontab -l
# m h  dom mon dow   command
* * * * * echo `date` >> /vagrant/hoge/log1.log
*/1 * * * * echo `date` >> /vagrant/hoge/log2.log
*/3 * * * * echo `date` >> /vagrant/hoge/log3.log
0/1 * * * * echo `date` >> /vagrant/hoge/log4.log
0/3 * * * * echo `date` >> /vagrant/hoge/log5.log
5/1 * * * * echo `date` >> /vagrant/hoge/log6.log
5/3 * * * * echo `date` >> /vagrant/hoge/log7.log
10-20 * * * * echo `date` >> /vagrant/hoge/log8.log
10-20/1 * * * * echo `date` >> /vagrant/hoge/log9.log
10-20/3 * * * * echo `date` >> /vagrant/hoge/log10.log
10,20 * * * * echo `date` >> /vagrant/hoge/log11.log
10,20/2 * * * * echo `date` >> /vagrant/hoge/log12.log
```

# 出力データ

## crontab登録直後から1分ごと

```
* * * * * echo `date` >> /vagrant/hoge/log1.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log1.log 
Fri Oct 5 05:40:01 UTC 2018
Fri Oct 5 05:41:01 UTC 2018
Fri Oct 5 05:42:01 UTC 2018
:
Fri Oct 5 07:20:01 UTC 2018
Fri Oct 5 07:21:01 UTC 2018
Fri Oct 5 07:22:01 UTC 2018
```

## crontab登録直後から1分ごと(`/n`指定)

```
*/1 * * * * echo `date` >> /vagrant/hoge/log2.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log2.log 
Fri Oct 5 05:40:01 UTC 2018
Fri Oct 5 05:41:01 UTC 2018
Fri Oct 5 05:42:01 UTC 2018
:
Fri Oct 5 07:20:01 UTC 2018
Fri Oct 5 07:21:01 UTC 2018
Fri Oct 5 07:22:01 UTC 2018
```

## crontab登録直後から3分ごと

```
*/3 * * * * echo `date` >> /vagrant/hoge/log3.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log3.log 
Fri Oct 5 05:42:01 UTC 2018
Fri Oct 5 05:45:01 UTC 2018
Fri Oct 5 05:48:01 UTC 2018
:
Fri Oct 5 07:15:01 UTC 2018
Fri Oct 5 07:18:01 UTC 2018
Fri Oct 5 07:21:01 UTC 2018
```

* 3で割り切れる分から実行している

## 毎時0分に1分ごと

```
0/1 * * * * echo `date` >> /vagrant/hoge/log4.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log4.log 
Fri Oct 5 06:00:01 UTC 2018
Fri Oct 5 07:00:01 UTC 2018
```

* 毎時0分のみ実行

## 毎時0分に3分ごと

```
0/3 * * * * echo `date` >> /vagrant/hoge/log5.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log5.log 
Fri Oct 5 06:00:01 UTC 2018
Fri Oct 5 07:00:01 UTC 2018
```

* 毎時0分のみ実行

## 毎時5分に1分ごと

```
5/1 * * * * echo `date` >> /vagrant/hoge/log6.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log6.log 
Fri Oct 5 06:05:01 UTC 2018
Fri Oct 5 07:05:01 UTC 2018
```

* 毎時5分のみ実行

## 毎時5分に3分ごと

```
5/3 * * * * echo `date` >> /vagrant/hoge/log7.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log7.log 
Fri Oct 5 06:05:01 UTC 2018
Fri Oct 5 07:05:01 UTC 2018
```

* 毎時5分のみ実行

## 毎時10分〜20分まで毎分

```
10-20 * * * * echo `date` >> /vagrant/hoge/log8.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log8.log 
Fri Oct 5 06:10:01 UTC 2018
Fri Oct 5 06:11:01 UTC 2018
Fri Oct 5 06:12:01 UTC 2018
:
Fri Oct 5 06:18:01 UTC 2018
Fri Oct 5 06:19:01 UTC 2018
Fri Oct 5 06:20:01 UTC 2018
Fri Oct 5 07:10:01 UTC 2018
Fri Oct 5 07:11:01 UTC 2018
Fri Oct 5 07:12:01 UTC 2018
:
Fri Oct 5 07:18:01 UTC 2018
Fri Oct 5 07:19:01 UTC 2018
Fri Oct 5 07:20:01 UTC 2018
```

## 毎時10分〜20分まで毎1分ごと

```
10-20/1 * * * * echo `date` >> /vagrant/hoge/log9.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log9.log 
Fri Oct 5 06:10:01 UTC 2018
Fri Oct 5 06:11:01 UTC 2018
Fri Oct 5 06:12:01 UTC 2018
:
Fri Oct 5 06:18:01 UTC 2018
Fri Oct 5 06:19:01 UTC 2018
Fri Oct 5 06:20:01 UTC 2018
Fri Oct 5 07:10:01 UTC 2018
Fri Oct 5 07:11:01 UTC 2018
Fri Oct 5 07:12:01 UTC 2018
:
Fri Oct 5 07:18:01 UTC 2018
Fri Oct 5 07:19:01 UTC 2018
Fri Oct 5 07:20:01 UTC 2018
```

## 毎時10分〜20分まで3分ごと

```
10-20/3 * * * * echo `date` >> /vagrant/hoge/log10.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log10.log 
Fri Oct 5 06:10:01 UTC 2018
Fri Oct 5 06:13:01 UTC 2018
Fri Oct 5 06:16:01 UTC 2018
Fri Oct 5 06:19:01 UTC 2018
Fri Oct 5 07:10:01 UTC 2018
Fri Oct 5 07:13:01 UTC 2018
Fri Oct 5 07:16:01 UTC 2018
Fri Oct 5 07:19:01 UTC 2018
```

* 10分から3分刻み

## 毎時10分と20分に実行

```
10,20 * * * * echo `date` >> /vagrant/hoge/log11.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log11.log 
Fri Oct 5 06:10:01 UTC 2018
Fri Oct 5 06:20:01 UTC 2018
Fri Oct 5 07:10:01 UTC 2018
Fri Oct 5 07:20:01 UTC 2018
```

## 毎時10分と、20分を3分刻みに実行

```
10,20/3 * * * * echo `date` >> /vagrant/hoge/log12.log
```

```
vagrant@vagrant:/vagrant/hoge$ cat log12.log 
Fri Oct 5 06:10:01 UTC 2018
Fri Oct 5 06:20:01 UTC 2018
Fri Oct 5 07:10:01 UTC 2018
Fri Oct 5 07:20:01 UTC 2018
```

* 10分と20分のみ実行

# 追加検証

## 0分から59分まで毎分

~~~
0-59 * * * * echo `date` >> /vagrant/hoge/log13.log
~~~

~~~
vagrant@vagrant:/vagrant/hoge$ cat log13.log 
Fri Oct 5 07:36:01 UTC 2018
Fri Oct 5 07:37:01 UTC 2018
Fri Oct 5 07:38:01 UTC 2018
~~~

* 次の時の0分から始まると予想したが、cron開始直後から実行していた

# まとめ

* 実行開始は各分の1秒に開始している(本当は0秒かも？)
* `*/n`を入れると、nで割り切れる分（0,3,6,9,12...分）から計測開始
* `10-20/n`を入れると、10分から計測開始
* 分を特定の値でしめしているときは`/n`を指定しても無視される
* 5時0分より毎分、という処理をcrontabで登録しようとすると、4時59分にcrontabを更新しないといけない

# 補遺：指定時間からの実行はできるのか？

* cronを１行で済ませるのは不可能
  * 開始時刻を指定できない

### 例：その日の１５時から、毎分ごとの処理をcronさせたい場合

* １４時３０分に指定すると仮定

~~~
* 15-23 * * * 処理
#* 0-14 * * * 処理
~~~

* １５時を過ぎたら２行目のコメントアウトを外す
  * 行が増えるが安全確実