読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

crontabで実行時刻を適当に割り振るときの一案

UNIX Linux PHP

どちらかというと、単なるネタ記事(何)。

cronで実行する処理で、以下の要件を満たすような場合に自分が使っている実行時刻の決め方の一つ。

  • 1日1回実行されればよい
  • 似たような処理が複数あるが、随時増えていく
    • (同じコマンドのパラメータ違いを別々にcrontabのエントリにするとか)
  • 実行時刻は問わないので、負荷分散のために適当にばらけさせたい

ただ単に「時」「分」を整然と並べても面白くないので、以下のように生成している。

  • 「時」は0から23まで順番に
  • 「分」は素数を順に使用(0から59までの間に17個ある)

せっかくなので(謎)、それを生成するPHPプログラムを書いてみた。

<?php
$h = range(0, 23, 1);
$m = array();
// 素数列を生成
for($p = 1; ($p = gmp_intval(gmp_nextprime($p))) < 60;) {
    $m[] = $p;
}

$mi = 0;
$hi = 0;
do {
    printf("%02d %02d *  *  *\n", $m[$mi], $h[$hi]);
    $mi = ($mi + 1) % count($m);
    $hi = ($hi + 1) % count($h);
} while ($mi != 0 || $hi != 0);

使用している関数については、以下を参考に。

実行結果を整形して表にしてみると、以下のような感じ。(表示の都合上、crontabに書く「日」「月」「曜日」は省略)

1周目 2周目 3周目 4周目 5周目 6周目 7周目 8周目 9周目 10周目
00時台 02 00 19 00 47 00 11 00 37 00 03 00 23 00 53 00 13 00 41 00
01時台 03 01 23 01 53 01 13 01 41 01 05 01 29 01 59 01 17 01 43 01
02時台 05 02 29 02 59 02 17 02 43 02 07 02 31 02 02 02 19 02 47 02
03時台 07 03 31 03 02 03 19 03 47 03 11 03 37 03 03 03 23 03 53 03
04時台 11 04 37 04 03 04 23 04 53 04 13 04 41 04 05 04 29 04 59 04
05時台 13 05 41 05 05 05 29 05 59 05 17 05 43 05 07 05 31 05 02 05
06時台 17 06 43 06 07 06 31 06 02 06 19 06 47 06 11 06 37 06 03 06
07時台 19 07 47 07 11 07 37 07 03 07 23 07 53 07 13 07 41 07 05 07
08時台 23 08 53 08 13 08 41 08 05 08 29 08 59 08 17 08 43 08 07 08
09時台 29 09 59 09 17 09 43 09 07 09 31 09 02 09 19 09 47 09 11 09
10時台 31 10 02 10 19 10 47 10 11 10 37 10 03 10 23 10 53 10 13 10
11時台 37 11 03 11 23 11 53 11 13 11 41 11 05 11 29 11 59 11 17 11
12時台 41 12 05 12 29 12 59 12 17 12 43 12 07 12 31 12 02 12 19 12
13時台 43 13 07 13 31 13 02 13 19 13 47 13 11 13 37 13 03 13 23 13
14時台 47 14 11 14 37 14 03 14 23 14 53 14 13 14 41 14 05 14 29 14
15時台 53 15 13 15 41 15 05 15 29 15 59 15 17 15 43 15 07 15 31 15
16時台 59 16 17 16 43 16 07 16 31 16 02 16 19 16 47 16 11 16 37 16
17時台 02 17 19 17 47 17 11 17 37 17 03 17 23 17 53 17 13 17 41 17
18時台 03 18 23 18 53 18 13 18 41 18 05 18 29 18 59 18 17 18 43 18
19時台 05 19 29 19 59 19 17 19 43 19 07 19 31 19 02 19 19 19 47 19
20時台 07 20 31 20 02 20 19 20 47 20 11 20 37 20 03 20 23 20 53 20
21時台 11 21 37 21 03 21 23 21 53 21 13 21 41 21 05 21 29 21 59 21
22時台 13 22 41 22 05 22 29 22 59 22 17 22 43 22 07 22 31 22 02 22
23時台 17 23 43 23 07 23 31 23 02 23 19 23 47 23 11 23 37 23 03 23
11周目 12周目 13周目 14周目 15周目 16周目 17周目
00時台 05 00 29 00 59 00 17 00 43 00 07 00 31 00
01時台 07 01 31 01 02 01 19 01 47 01 11 01 37 01
02時台 11 02 37 02 03 02 23 02 53 02 13 02 41 02
03時台 13 03 41 03 05 03 29 03 59 03 17 03 43 03
04時台 17 04 43 04 07 04 31 04 02 04 19 04 47 04
05時台 19 05 47 05 11 05 37 05 03 05 23 05 53 05
06時台 23 06 53 06 13 06 41 06 05 06 29 06 59 06
07時台 29 07 59 07 17 07 43 07 07 07 31 07 02 07
08時台 31 08 02 08 19 08 47 08 11 08 37 08 03 08
09時台 37 09 03 09 23 09 53 09 13 09 41 09 05 09
10時台 41 10 05 10 29 10 59 10 17 10 43 10 07 10
11時台 43 11 07 11 31 11 02 11 19 11 47 11 11 11
12時台 47 12 11 12 37 12 03 12 23 12 53 12 13 12
13時台 53 13 13 13 41 13 05 13 29 13 59 13 17 13
14時台 59 14 17 14 43 14 07 14 31 14 02 14 19 14
15時台 02 15 19 15 47 15 11 15 37 15 03 15 23 15
16時台 03 16 23 16 53 16 13 16 41 16 05 16 29 16
17時台 05 17 29 17 59 17 17 17 43 17 07 17 31 17
18時台 07 18 31 18 02 18 19 18 47 18 11 18 37 18
19時台 11 19 37 19 03 19 23 19 53 19 13 19 41 19
20時台 13 20 41 20 05 20 29 20 59 20 17 20 43 20
21時台 17 21 43 21 07 21 31 21 02 21 19 21 47 21
22時台 19 22 47 22 11 22 37 22 03 22 23 22 53 22
23時台 23 23 53 23 13 23 41 23 05 23 29 23 59 23

全部で408通りできる。
使用される素数の個数である「17」自体が素数なので、割とばらけているように見える(ぇ。