pg_task

execute any sql command at any specific time at background

Overview

PackageVersionCategoryLicenseLanguage
pg_task2.1.29TIMEMITC
IDExtensionBinLibLoadCreateTrustRelocSchema
1080pg_taskNoYesYesNoNoNo-
Relatedtimescaledb pg_cron pg_later pg_background pg_partman timescaledb_toolkit timeseries periods

breaks on many systems

Version

TypeRepoVersionPG VerPackageDeps
EXTPIGSTY2.1.291817161514pg_task-
RPMPIGSTY2.1.291817161514pg_task_$v-
DEBPIGSTY2.1.291817161514postgresql-$v-pg-task-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
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
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
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
u26.aarch64

Build

You can build the RPM / DEB packages for pg_task using pig build:

pig build pkg pg_task         # build RPM / DEB packages

Install

You can install pg_task directly. First, make sure the PGDG and PIGSTY repositories are added and enabled:

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

Install the extension using pig or apt/yum/dnf:

pig install pg_task;          # Install for current active PG version
pig ext install -y pg_task -v 18  # PG 18
pig ext install -y pg_task -v 17  # PG 17
pig ext install -y pg_task -v 16  # PG 16
pig ext install -y pg_task -v 15  # PG 15
pig ext install -y pg_task -v 14  # PG 14
dnf install -y pg_task_18       # PG 18
dnf install -y pg_task_17       # PG 17
dnf install -y pg_task_16       # PG 16
dnf install -y pg_task_15       # PG 15
dnf install -y pg_task_14       # PG 14
apt install -y postgresql-18-pg-task   # PG 18
apt install -y postgresql-17-pg-task   # PG 17
apt install -y postgresql-16-pg-task   # PG 16
apt install -y postgresql-15-pg-task   # PG 15
apt install -y postgresql-14-pg-task   # PG 14

Preload:

shared_preload_libraries = 'pg_task';

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:

NameTypeDefaultDescription
idbigserialautoincrementPrimary key
parentbigintpg_task.idParent task id
plantimestamptzstatement_timestamp()Planned start time
starttimestamptzActual start time
stoptimestamptzActual stop time
activeinterval1 hourPeriod after plan time when task is active
liveinterval0 secMax lifetime of background worker
repeatinterval0 secAuto repeat interval
timeoutinterval0 secAllowed time for task run
countint0Max task count before worker exit
maxint0Max concurrent tasks in group; negative values mean pause between tasks in milliseconds
pidintProcess id executing task
stateenumPLANPLAN, TAKE, WORK, DONE, STOP
deletebooltrueAuto delete when output and error are null
driftboolfalseCompute next repeat by stop time
headerbooltrueShow column headers in output
grouptext‘group’Task grouping name
inputtextSQL command(s) to execute
outputtextReceived result(s)
errortextCaught error
remotetextRemote database connection string

Configuration

Key settings:

NameTypeDefaultDescription
pg_task.deletebooltrueAuto delete completed tasks
pg_task.driftboolfalseCompute repeat by stop time
pg_task.headerbooltrueShow column headers in task output
pg_task.stringbooltrueQuote only strings in output
pg_task.countint0Default maximum number of tasks per worker before exit
pg_task.fetchint100Number of task rows fetched at once
pg_task.limitint1000Limit task rows at once
pg_task.maxint0Default max concurrent tasks in group
pg_task.runint2147483647Maximum concurrently executing tasks in work
pg_task.sleepint1000Check tasks every N milliseconds
pg_task.activeinterval1 hourPeriod after plan time when a task remains active for execution
pg_task.liveinterval0 secMaximum lifetime of a worker process
pg_task.repeatinterval0 secDefault repeat interval
pg_task.timeoutinterval0 secDefault task timeout
pg_task.datatextpostgresDatabase name for tasks table
pg_task.usertextpostgresUser name for tasks table
pg_task.schematextpublicSchema name for tasks table
pg_task.tabletexttaskTable name for tasks table
pg_task.jsonjson[{"data":"postgres"}]Multi-database configuration
pg_task.idbigint0Current 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 Modified 2026-07-02: extension update 2026-07-02 (f9f0d13)