pg_task
Overview
| Package | Version | Category | License | Language |
|---|---|---|---|---|
pg_task | 1.0.0 | 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 | PGDG | 1.0.0 | 1817161514 | pg_task | - |
| RPM | PGDG | 2.1.7 | 1817161514 | pg_task_$v | - |
| DEB | PIGSTY | 2.1.12 | 1817161514 | postgresql-$v-pg-task | - |
Build
You can build the DEB packages for pg_task using pig build:
pig build pkg pg_task # build DEB packages
Install
You can install pg_task directly. First, make sure the PGDG repository is added and enabled:
pig repo add pgdg -u # Add PGDG 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
pg_task allows executing any SQL command at any specific time in the background asynchronously. It works with PostgreSQL, Greenplum and Greengage.
First, add to postgresql.conf:
shared_preload_libraries = 'pg_task'
Then schedule tasks by inserting into the task table:
-- 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
INSERT INTO task (group, max, input) VALUES ('group', 1, 'SELECT now()');
-- Run SQL on a remote database
INSERT INTO task (input, remote) VALUES ('SELECT now()', 'user=user host=host');
Task Table 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 |
| 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 |
You may add any needed columns and/or make partitions on this table.
Configuration (GUCs)
Key settings:
| Name | Type | Default | Description |
|---|---|---|---|
| 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.sleep | int | 1000 | Check tasks every N milliseconds |
| pg_task.delete | bool | true | Auto delete completed tasks |
| pg_task.drift | bool | false | Compute repeat by stop time |
| pg_task.repeat | interval | 0 sec | Default repeat interval |
| pg_task.timeout | interval | 0 sec | Default task timeout |
| pg_task.max | int | 0 | Default max concurrent tasks in group |
| pg_task.run | int | 2147483647 | Max concurrent tasks in work |
| pg_task.json | json | [{“data”:“postgres”}] | Multi-database configuration |
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.
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.