pg_task
Overview
| Package | Version | Category | License | Language |
|---|---|---|---|---|
pg_task | 2.1.29 | TIME | MIT | C |
| ID | Extension | Bin | Lib | Load | Create | Trust | Reloc | Schema |
|---|---|---|---|---|---|---|---|---|
| 1080 | pg_task | No | Yes | Yes | No | No | No | - |
| Related | timescaledb pg_cron pg_later pg_background pg_partman timescaledb_toolkit timeseries periods |
|---|
breaks on many systems
Version
| Type | Repo | Version | PG Ver | Package | Deps |
|---|---|---|---|---|---|
| EXT | PIGSTY | 2.1.29 | 1817161514 | pg_task | - |
| RPM | PIGSTY | 2.1.29 | 1817161514 | pg_task_$v | - |
| DEB | PIGSTY | 2.1.29 | 1817161514 | postgresql-$v-pg-task | - |
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:
| 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.
Feedback
Was this page helpful?
Thanks for the feedback! Please let us know how we can improve.
Sorry to hear that. Please let us know how we can improve.