Service unit configuration
With PostgreSQL 9.6 or newer, it is recommended to build with
--with-systemd and use the unit file shown in the documentation.
With older releases, the recommended approach is to write a unit file using
Type=forking and use
logind.conf controls whether System V IPC objects are removed when a user fully logs out. System users are exempt.
This was turned on by default in systemd version 212 (2014-03-25). RHEL7 ships 219. Debian stable (jessie) ships 215. Apparently, the systemd package in RHEL7 is built with it defaulting to off.
The observed effect of this is that the semaphore objects used by a PostgreSQL server are removed at apparently random times, leading to the server crashing with log messages like
LOG: semctl(1234567890, 0, IPC_RMID, ...) failed: Invalid argument
Shared memory segments that are still attached to are not cleaned up, so systemd will not remove shared memory segments still in use. But semaphores have no concept of a process being attached, so they will be cleaned up even if they are actually still in use.
A "user logging out" might happen as part of a maintenance job or manually when an administrator logs in as the
postgres user or similar, so it is hard to prevent.
What is a "system user" is determined at systemd compile time from the
SYS_UID_MAX setting in
It is recommended to set
on all server hosts used for PostgreSQL.
Also, packaging and deployment scripts should be careful to create the
postgres user as a system user by using
useradd -r or equivalent.
You have to do at least one of these two things, or your PostgreSQL server will be very unreliable.
logind.conf controls whether all processes of a user's session should be killed when the user logs out of that session.
This was turned on by default in systemd version 230 (2016-05-21). Currently (August 2016), this is not yet shipped widely (Fedora Branched/25, Debian testing, stable-backports).
This basically means that if you start a background server process such as PostgreSQL from the shell, it will be killed when you log out, unless you take special care. This has no harmful impact on PostgreSQL server instances started through system service units. It only affects background processes started from a user shell. This could apply if you don't use systemd service units but instead orchestrate the PostgreSQL server (or any other server process) using traditional init scripts or similar scripts.
There are various ways to adjust that, including
systemd-run. These are all explained on the
logind.conf man page. Note that being a "system user" has no influence here.