Skip to content
pg_task

pg_task

pg_task : execute any sql command at any specific time at background

Overview

ID Extension Package Version Category License Language
1080
pg_task
pg_task
2.1.29
TIME
MIT
C
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--sL---
No
Yes
Yes
No
no
no
Relationships
See Also
timescaledb
pg_cron
pg_later
pg_background
pg_partman
timescaledb_toolkit
timeseries
periods

breaks on many systems

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PIGSTY
2.1.29
18
17
16
15
14
pg_task -
RPM
PIGSTY
2.1.29
18
17
16
15
14
pg_task_$v -
DEB
PIGSTY
2.1.29
18
17
16
15
14
postgresql-$v-pg-task -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
el8.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
el9.x86_64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
el9.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
el10.x86_64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
el10.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
d12.x86_64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
d12.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
d13.x86_64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
d13.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
u22.x86_64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
u22.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
u24.x86_64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
u24.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
u26.x86_64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
u26.aarch64
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
PIGSTY 2.1.29
Package Version OS ORG SIZE File URL
pg_task_18 2.1.29 el8.x86_64 pigsty 54.8 KiB pg_task_18-2.1.29-1PIGSTY.el8.x86_64.rpm
pg_task_18 2.1.7 el8.x86_64 pgdg 72.4 KiB pg_task_18-2.1.7-3PGDG.rhel8.x86_64.rpm
pg_task_18 2.1.29 el8.aarch64 pigsty 49.8 KiB pg_task_18-2.1.29-1PIGSTY.el8.aarch64.rpm
pg_task_18 2.1.7 el8.aarch64 pgdg 63.3 KiB pg_task_18-2.1.7-3PGDG.rhel8.aarch64.rpm
pg_task_18 2.1.29 el9.x86_64 pigsty 54.7 KiB pg_task_18-2.1.29-1PIGSTY.el9.x86_64.rpm
pg_task_18 2.1.29 el9.aarch64 pigsty 52.7 KiB pg_task_18-2.1.29-1PIGSTY.el9.aarch64.rpm
pg_task_18 2.1.29 el10.x86_64 pigsty 54.9 KiB pg_task_18-2.1.29-1PIGSTY.el10.x86_64.rpm
pg_task_18 2.1.29 el10.aarch64 pigsty 52.7 KiB pg_task_18-2.1.29-1PIGSTY.el10.aarch64.rpm
postgresql-18-pg-task 2.1.29 d12.x86_64 pigsty 38.5 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~bookworm_amd64.deb
postgresql-18-pg-task 2.1.29 d12.aarch64 pigsty 35.3 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~bookworm_arm64.deb
postgresql-18-pg-task 2.1.29 d13.x86_64 pigsty 38.8 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~trixie_amd64.deb
postgresql-18-pg-task 2.1.29 d13.aarch64 pigsty 35.6 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~trixie_arm64.deb
postgresql-18-pg-task 2.1.29 u22.x86_64 pigsty 42.5 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~jammy_amd64.deb
postgresql-18-pg-task 2.1.29 u22.aarch64 pigsty 41.0 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~jammy_arm64.deb
postgresql-18-pg-task 2.1.29 u24.x86_64 pigsty 41.1 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~noble_amd64.deb
postgresql-18-pg-task 2.1.29 u24.aarch64 pigsty 39.7 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~noble_arm64.deb
postgresql-18-pg-task 2.1.29 u26.x86_64 pigsty 41.1 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~resolute_amd64.deb
postgresql-18-pg-task 2.1.29 u26.aarch64 pigsty 39.6 KiB postgresql-18-pg-task_2.1.29-2PIGSTY~resolute_arm64.deb

Source

pig build pkg pg_task;		# build rpm/deb

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both repo and update cache

Install this extension with pig:

pig install pg_task;		# install via package name, for the active PG version

pig install pg_task -v 18;   # install for PG 18
pig install pg_task -v 17;   # install for PG 17
pig install pg_task -v 16;   # install for PG 16
pig install pg_task -v 15;   # install for PG 15
pig install pg_task -v 14;   # install for PG 14

Config this extension to shared_preload_libraries:

shared_preload_libraries = 'pg_task';

This extension does not need CREATE EXTENSION DDL command

Usage

Sources: pg_task upstream README, PGXN pg_task, local metadata.

pg_task is a background-worker scheduler for running SQL asynchronously at a planned time. Upstream documents PostgreSQL, Greenplum, and Greengage support.

Enable the worker at server start, then create the extension in the database that will own the task table:

shared_preload_libraries = 'pg_task'
CREATE EXTENSION pg_task;

Schedule Tasks

Schedule work by inserting rows into the configured task table, which defaults to public.task in database postgres unless changed with GUCs.

-- Run SQL immediately
INSERT INTO task (input) VALUES ('SELECT now()');

-- Run SQL after 5 minutes
INSERT INTO task (plan, input) VALUES (now() + '5 min'::interval, 'SELECT now()');

-- Run SQL at a specific time
INSERT INTO task (plan, input) VALUES ('2029-07-01 12:51:00', 'SELECT now()');

-- Repeat SQL every 5 minutes
INSERT INTO task (repeat, input) VALUES ('5 min', 'SELECT now()');

-- Exceptions are caught and written to the error column
INSERT INTO task (input) VALUES ('SELECT 1/0');

-- Limit concurrent tasks in a group.
-- max = 1 means one task at a time for this group.
INSERT INTO task ("group", max, input) VALUES ('billing', 1, 'SELECT refresh_billing_cache()');

-- Run SQL on a remote database
INSERT INTO task (input, remote) VALUES ('SELECT now()', 'user=user host=host');

Task Table

The task table is meant to be user-visible. Upstream notes that users may add columns or partition it.

Key columns:

Name Type Default Description
id bigserial autoincrement Primary key
parent bigint pg_task.id Parent task id
plan timestamptz statement_timestamp() Planned start time
start timestamptz Actual start time
stop timestamptz Actual stop time
active interval 1 hour Period after plan time when task is active
live interval 0 sec Max lifetime of background worker
repeat interval 0 sec Auto repeat interval
timeout interval 0 sec Allowed time for task run
count int 0 Max task count before worker exit
max int 0 Max concurrent tasks in group; negative values mean pause between tasks in milliseconds
pid int Process id executing task
state enum PLAN PLAN, TAKE, WORK, DONE, STOP
delete bool true Auto delete when output and error are null
drift bool false Compute next repeat by stop time
header bool true Show column headers in output
group text ‘group’ Task grouping name
input text SQL command(s) to execute
output text Received result(s)
error text Caught error
remote text Remote database connection string

Configuration

Key settings:

Name Type Default Description
pg_task.delete bool true Auto delete completed tasks
pg_task.drift bool false Compute repeat by stop time
pg_task.header bool true Show column headers in task output
pg_task.string bool true Quote only strings in output
pg_task.count int 0 Default maximum number of tasks per worker before exit
pg_task.fetch int 100 Number of task rows fetched at once
pg_task.limit int 1000 Limit task rows at once
pg_task.max int 0 Default max concurrent tasks in group
pg_task.run int 2147483647 Maximum concurrently executing tasks in work
pg_task.sleep int 1000 Check tasks every N milliseconds
pg_task.active interval 1 hour Period after plan time when a task remains active for execution
pg_task.live interval 0 sec Maximum lifetime of a worker process
pg_task.repeat interval 0 sec Default repeat interval
pg_task.timeout interval 0 sec Default task timeout
pg_task.data text postgres Database name for tasks table
pg_task.user text postgres User name for tasks table
pg_task.schema text public Schema name for tasks table
pg_task.table text task Table name for tasks table
pg_task.json json [{"data":"postgres"}] Multi-database configuration
pg_task.id bigint 0 Current task id, read-only session setting

Multi-Database Configuration

To run tasks on multiple databases, configure via JSON:

pg_task.json = '[{"data":"database1"},{"data":"database2","user":"username2"},{"data":"database3","schema":"schema3"}]'

If the specified database, user, schema or table does not exist, pg_task will create them.

The local metadata marks this package as headless, so it needs shared_preload_libraries rather than a user-facing SQL-only install path. Validate background scheduling behavior on the target PostgreSQL version before relying on it for critical jobs.

Last updated on