業務自動化・iPaaS・RPA

ジョブスケジューリングとは|48回のうち20回が前の実行と重なった

ジョブスケジューリングで何を決めるのか前の実行と重なると何が起きるのか見送るのと待たせるのはどちらがよいのか

5分ごとに動かしている処理が、たまに17分かかることがあります。次の起動が来ても、前がまだ終わっていません

4時間ぶん48回を並べて測りました。何もしないと20回が前の実行と重なります。見送る方式なら10回が実行されず、待たせる方式なら最大16分遅れます。

この記事の要点

  • そのまま起動すると20回が重なる
  • 見送る方式では10回が実行されない
  • 待たせる方式では最大16分遅れる
  • 処理時間が間隔を超えたのは7回/48回

48回のうち20回が前の実行と重なった

3通りの扱い方を同じ条件で走らせました。どれを選んでも、何かを失います。

ジョブスケジューリングで起動が重なると何が起きるのかを、実際に走らせて測りました。5分ごとの起動を4時間ぶん、48回並べています。

処理にかかる時間はふだん1分から3分ですが、15%の割合で8分から17分に長引くようにしました。実際の業務処理に近い形です。

javascript
let ran = 0, skipped = 0, busyUntil = -1;
for (let i = 0; i < RUNS; i++) {
  const start = i * EVERY;
  if (start < busyUntil) { skipped++; continue; }
  ran++; busyUntil = start + durations[i];
}
text
5分ごとに起動する処理を、4時間ぶん(48回)並べる

やり方                  実際に走った回数  重なった回数  取りこぼした回数
そのまま起動する                         48回           20回                0回
前が動いていたら見送る                      38回            0回               10回
順番に待たせる                          48回            0回                0回

順番に待たせた場合、予定より最大 16分 遅れて始まった。
処理時間が起動の間隔(5分)を超えた回数: 7回 / 48回
処理時間の最大: 17分・最小: 1分

上の表を見てください。そのまま起動すると48回のうち20回が前の実行と重なりました。4割です。

長引いたのは7回だけ

処理時間が5分を超えたのは48回のうち7回です。それでも重なりは20回になりました。

1回17分かかると、その間に3回の起動が重なります。長引いた回数より、重なる回数のほうが多くなります。

どれを選んでも何かを失う

見送る方式なら重なりは0回です。代わりに10回が実行されません。Kubernetesも、この方式では新しい実行を飛ばすと説明しています。

順番に待たせる方式なら48回すべて実行されます。代わりに予定より最大16分遅れて始まりました

重なりを消すと、実行されない回か遅れが出る。

そのまま起動する重ならなかった28重なった2048回前が動いていたら見送る381048回順番に待たせる4848回5分ごと48回での実測。順番に待たせた場合は予定より最大16分遅れて始まった。
図1 ── 3通りの扱い方で失うもの
出典Kubernetes ドキュメント「CronJob」2026-08-18 確認
The CronJob does not allow concurrent runs; if it is time for a new Job run and the previous Job run hasn't finished yet, the CronJob skips the new Job run.
原文Kubernetes ドキュメント「CronJob」 この内容の有効期限2027-02-18

ジョブスケジューリングで決めること

起動する時刻だけでなく、前の実行が終わっていないときにどうするかを決めます。決めなければ既定の動きが出ます。

ジョブスケジューリングは、決まった時刻に処理を起動する仕組みです。決めるのは時刻だけではありません。

重なったときの扱い

前の実行が終わっていないときの扱いは、選べるようになっていることが多いです。Kubernetesでは3通りから選びます。

  1. そのまま起動する。既定はこれ。重なることを許す
  2. 見送る。前が動いていれば、その回は起動しない
  3. 置き換える。動いている実行を止めて、新しく始める
  4. 順番に待たせる。前が終わってから始める

3番目についてKubernetesは、新しい実行の時刻になったのに前の実行が終わっていない場合、動いている実行を新しい実行で置き換えると説明しています。前の処理は途中で止まります。

遅れて起動した場合

起動そのものが遅れることもあります。仕組みが止まっていた、負荷が高かった、といった理由です。

この場合の扱いも決められます。Kubernetesでは期限を過ぎると、その回の実行を飛ばす形です。以降の予定はそのまま続きます。

前提になる性質

どの方式を選んでも、同じ処理が2回走る可能性は消えません。置き換える方式なら、途中まで進んだ処理がもう一度最初から走ります。

だからKubernetesも、定義する処理は冪等であるべきだとしています。何度実行しても結果が変わらない作りが前提です。詳しくは冪等性の記事で扱っています。

余談 この計測での注意

処理時間は種を固定した乱数で決めています。長引く割合を15%としましたが、実際の割合は処理の中身で変わります。まず自分の処理時間を記録して、最大値が起動の間隔を超えているかを見るところから始めてください。

出典Kubernetes ドキュメント「CronJob」2026-08-18 確認
If it is time for a new Job run and the previous Job run hasn't finished yet, the CronJob replaces the currently running Job run with a new Job run
原文Kubernetes ドキュメント「CronJob」 この内容の有効期限2027-02-18

ジョブスケジューリングでよくある失敗

平均の処理時間を見て間隔を決めることです。重なりを決めるのは平均ではなく最大です。

ジョブスケジューリングでいちばん多い失敗は、ふだんの処理時間を見て間隔を決めることです。

平均では決まらない

前の節の計測では、処理時間の大半は1分から3分でした。5分ごとの起動なら余裕があるように見えます。

ところが最大は17分でした。この7回が20回の重なりを生んでいます。決めているのは平均ではなく最大です。

実行されない回に気づけない

見送る方式にすると、10回が実行されません。これは失敗として記録されないことがあります。

Kubernetesも、期限を過ぎた場合についてその回の実行を飛ばし、以降の予定はそのまま続くとしています。飛ばしたことを数えていないと、処理されていない期間ができます。

確かめる順番

  1. 処理時間を記録する。平均ではなく最大を見る
  2. 最大が間隔を超えているか。超えていれば重なる
  3. 重なったときの扱いを決める。既定のままにしない
  4. 飛ばした回数を数える。見送る方式なら必ず

4番目が抜けると、処理されていない期間が静かにできます。前の節では4時間で10回でした。

決めているのは平均ではなく最大。

充足 2 / 4処理時間の最大を記録している実測では大半が1分から3分でも、最大17分が20回の重なりを生んだ重なったときの扱いを決めている既定はそのまま起動する方式で、同じデータを同時に触る平均の処理時間で間隔を決めている長引いた7回が重なりを作る。平均では判断できない見送った回数を数えていない失敗として記録されず、処理されていない期間が静かにできる5分ごと48回での実測にもとづく。処理時間が間隔を超えたのは7回だった。
図2 ── 定時処理の点検項目
出典Kubernetes ドキュメント「CronJob」2026-08-18 確認
After missing the deadline, the CronJob skips that instance of the Job (future occurrences are still scheduled).
原文Kubernetes ドキュメント「CronJob」 この内容の有効期限2027-02-18

よくある質問

重なると何が問題ですか
同じデータを2つの処理が同時に触ります。冪等でない処理なら、二重に反映されます。
見送る方式なら安全ですか
重なりは0回になりますが、この計測では10回が実行されませんでした。その回の処理は行われません。
待たせる方式の欠点は何ですか
予定より遅れて始まります。この計測では最大16分でした。時刻が意味を持つ処理には向きません。
どれを選べばよいですか
実行されない回があってよいなら見送る方式です。全部実行したいなら待たせる方式になります。

まとめ

  • 決まった時刻に処理を起動する仕組み
  • そのまま起動すると20回が重なる
  • 見送る方式では10回が実行されない
  • 待たせる方式では最大16分遅れる

今日から始められること

  1. 処理にかかる時間を記録して、最大値を見る
  2. 最大値が起動の間隔を超えていないか確かめる
  3. 超えているなら、重なったときの扱いを決める
  4. 処理そのものを何度実行しても同じ結果になるようにする

実務で組んだジョブスケジューリングのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る