Postgresql
如何每 10 秒執行一次 pgAgent 作業?
我有一個 PostgreSQL 11.3 數據庫。我安裝了 pgAgent 來創建工作。現在我想每 10 秒執行一次我的工作,但是在 GUI 中,有可能以分鐘的精度而不是秒的精度來編寫。
是否可以比每分鐘更快地執行 pgAgent 創建的作業?
由於它使用的是 cron 樣式的調度定義,因此不太可能支持亞分鐘粒度,因為大多數(全部?) cron 實現都不支持。
我曾經使用 cron 比每分鐘更頻繁地執行任務的一個技巧是 cron 每分鐘呼叫一次的腳本,該腳本執行其任務,稍作睡眠,然後重複。例如每分鐘執行次數:
dotask; sleep 15; dotask; sleep 15; dotask; sleep 15; dotask;
. 你可以用pg_sleep做類似的事情。有一些注意事項需要注意,包括:
- 通過計劃配置停止任務後,您的任務可能會再執行幾次。
- 如果任務需要相當長的時間,您需要在睡眠時間中對此進行調整。如果花費的時間是可變的,那麼您需要比簡單的靜態睡眠呼叫更亮:對於 4/分鐘範例,您的第一次睡眠將是“15-minus-current-seconds-on-wall-clock seconds”,秒為“30 減去目前秒在掛鐘秒”。
- 如果任務的完成時間比您的目標時間粒度更長,您可能會遇到兩個實例試圖同時執行的潛在問題,這可能會導致鎖定問題和/或使您的數據庫陷入困境。
另一種選擇是定義多個任務,所有任務都設置為即時執行。第一個立即執行,第二個在執行實際工作之前休眠幾秒鐘,第二個休眠 *2 等。因此,對於通過 cron 每分鐘執行四次任務,您將擁有:
* * * * * dotask.sh * * * * * sleep 15 && dotask.sh * * * * * sleep 30 && dotask.sh * * * * * sleep 45 && dotask.sh
cron
(其中 5 *s 表示在的配置文件中“每分鐘執行一次”
) 這消除了確切的睡眠時間問題(上面的第二個問題),但可能會使多實例執行在- 曾經的問題(上面的第三個問題)更令人擔憂。這兩種選擇都有些駭人聽聞…