Recently a commit landed in the PostgreSQL development tree that made me aware of something I did not know so far: When you start PostgreSQL with a script using pg_ctl and that script was cancelled the postmaster was killed as well before PostgreSQL 12. Sounds weird? Lets do a little demo.
The little demo script is quite simple: Print the version of pg_ctl, startup PostgreSQL and then sleep for 10 seconds:
postgres@pgbox:/home/postgres/ [PG10] cat start.sh #!/bin/bash /u01/app/postgres/product/10/db_3/bin/pg_ctl --version /u01/app/postgres/product/10/db_3/bin/pg_ctl -D /u02/pgdata/10/PG103 start sleep 10
When you execute that against PostgreSQL before version 12 and then CRTL-C the script while it is sleeping the postmaster will be killed as well:
postgres@pgbox:/home/postgres/ [PG10] ./start.sh pg_ctl (PostgreSQL) 10.5 waiting for server to start....2019-01-25 13:00:07.258 CET - 1 - 6853 - - @ LOG: listening on IPv4 address "0.0.0.0", port 5432 2019-01-25 13:00:07.259 CET - 2 - 6853 - - @ LOG: listening on IPv6 address "::", port 5432 2019-01-25 13:00:07.263 CET - 3 - 6853 - - @ LOG: listening on Unix socket "/tmp/.s.PGSQL.5432" 2019-01-25 13:00:07.282 CET - 4 - 6853 - - @ LOG: redirecting log output to logging collector process 2019-01-25 13:00:07.282 CET - 5 - 6853 - - @ HINT: Future log output will appear in directory "pg_log". done server started ^C postgres@pgbox:/home/postgres/ [PG10] ps -ef | grep postgres
Starting with PostgreSQL 12 this will not happen anymore:
postgres@pgbox:/home/postgres/ [PG10] cat start.sh #!/bin/bash /u01/app/postgres/product/DEV/db_1/bin/pg_ctl --version /u01/app/postgres/product/DEV/db_1/bin/pg_ctl -D /u02/pgdata/DEV start sleep 10 postgres@pgbox:/home/postgres/ [PGDEV] ./start.sh pg_ctl (PostgreSQL) 12devel waiting for server to start....2019-01-25 13:02:51.690 CET - 1 - 9408 - - @ LOG: listening on IPv6 address "::1", port 5433 2019-01-25 13:02:51.690 CET - 2 - 9408 - - @ LOG: listening on IPv4 address "127.0.0.1", port 5433 2019-01-25 13:02:51.700 CET - 3 - 9408 - - @ LOG: listening on Unix socket "/tmp/.s.PGSQL.5433" 2019-01-25 13:02:51.734 CET - 4 - 9408 - - @ LOG: redirecting log output to logging collector process 2019-01-25 13:02:51.734 CET - 5 - 9408 - - @ HINT: Future log output will appear in directory "pg_log". done server started ^C postgres@pgbox:/home/postgres/ [PGDEV] ps -ef | grep postgres postgres 9408 1 0 13:02 ? 00:00:00 /u01/app/postgres/product/DEV/db_1/bin/postgres -D /u02/pgdata/DEV postgres 9409 9408 0 13:02 ? 00:00:00 postgres: logger postgres 9411 9408 0 13:02 ? 00:00:00 postgres: checkpointer postgres 9412 9408 0 13:02 ? 00:00:00 postgres: background writer postgres 9413 9408 0 13:02 ? 00:00:00 postgres: walwriter postgres 9414 9408 0 13:02 ? 00:00:00 postgres: autovacuum launcher postgres 9415 9408 0 13:02 ? 00:00:00 postgres: stats collector postgres 9416 9408 0 13:02 ? 00:00:00 postgres: logical replication launcher postgres 9422 29009 0 13:03 pts/2 00:00:00 ps -ef postgres 9423 29009 0 13:03 pts/2 00:00:00 grep --color=auto postgres root 29005 2910 0 12:53 ? 00:00:00 sshd: postgres [priv] postgres 29008 29005 0 12:53 ? 00:00:01 sshd: postgres@pts/2 postgres 29009 29008 0 12:53 pts/2 00:00:00 -bash root 29463 2910 0 12:54 ? 00:00:00 sshd: postgres [priv] postgres 29466 29463 0 12:54 ? 00:00:00 sshd: postgres@pts/1 postgres 29467 29466 0 12:54 pts/1 00:00:00 -bash
Learned something new again.