web-dev-qa-db-ja.com

pgAgentが毎分ジョブを実行しないのはなぜですか?

ジョブがあり、毎分実行するようにスケジュールを設定しました。

enter image description here

ただし、プロセスが1分未満で終了した場合でも、プロセスの終了後は常に次の分をスキップします。

enter image description here

問題は、その分の間にデータがまだ到着しているため、ジョブが開始すると、2分のデータを処理する必要があることです。 15秒を2回実行するのではなく、30秒を1回実行するよりも、.

pgAgentを毎分実行するにはどうすればよいですか?

その他の場合、スケジュールを3分ごとに設定すると、pgAgentは4分をスキップして5分から開始します。

4

スケジュールされたジョブが完了すると、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;
4
Max Vernon