ジョブがあり、毎分実行するようにスケジュールを設定しました。
ただし、プロセスが1分未満で終了した場合でも、プロセスの終了後は常に次の分をスキップします。
問題は、その分の間にデータがまだ到着しているため、ジョブが開始すると、2分のデータを処理する必要があることです。 15秒を2回実行するのではなく、30秒を1回実行するよりも、.
pgAgentを毎分実行するにはどうすればよいですか?
その他の場合、スケジュールを3分ごとに設定すると、pgAgentは4分をスキップして5分から開始します。
スケジュールされたジョブが完了すると、pgAgentはジョブのpgagent.pga_job
行を更新します。その後、pgAgentは最低1分後にのみジョブを実行します。 「毎分」を実行するようにスケジュールされているジョブのスレッドは、毎分の最初に、毎分1回実行される新しいジョブを探します。したがって、ジョブが13:01:26に完了した場合、次回のスケジュール実行は13:02:00になりますが、ジョブは34秒前に完了したため、ジョブは実行されません。次にスケジューラが13:03:00に実行されるとき、ジョブが実行された1分以上前が確認され、ジョブが実行されます。
pgagent.pga_next_schedule
のpgAgentソースコードはこれを注記しています:
-- Get the time to find the next run after. It will just be the later of
-- now() + 1m and the start date for the time being, however, we might want to
-- do more complex things using this value in the future.
IF date_trunc(''MINUTE'', jscstart) > date_trunc(''MINUTE'', (now() + ''1 Minute''::interval)) THEN
runafter := date_trunc(''MINUTE'', jscstart);
ELSE
runafter := date_trunc(''MINUTE'', (now() + ''1 Minute''::interval));
END IF;