When examining the service status with systemctl status postgresql, we observe:
Active: active (exited) since Fr 2016-12-02 11:02:51 CET
Main PID: 2360 (code=exited, status=0/SUCCESS)
The critical detail here is the active (exited) state, indicating the service completes its execution chain but doesn't maintain a running process. This contrasts with the successful manual start:
sudo -u postgres /usr/lib/postgresql/9.5/bin/postgres -d 3 -D /var/lib/postgresql/9.5/main/ -c config_file=/etc/postgresql/9.5/main/postgresql.conf
The problematic service file (/lib/systemd/system/postgresql.service) shows unusual configuration:
[Service]
Type=oneshot
ExecStart=/bin/true
ExecReload=/bin/true
RemainAfterExit=on
Key issues identified:
- The
oneshottype indicates a service that should exit after execution /bin/trueexplains the immediate successful exit- Missing actual PostgreSQL startup command
Create a proper service override:
sudo systemctl edit postgresql
Add these contents:
[Service]
Type=forking
ExecStart=
ExecStart=/usr/bin/pg_ctlcluster 9.5 main start
ExecStop=
ExecStop=/usr/bin/pg_ctlcluster 9.5 main stop
Restart=on-failure
For multi-cluster systems, use the template service:
sudo systemctl start postgresql@9.5-main
This leverages the proper service definition from postgresql@.service which includes the correct pg_ctlcluster commands.
Check the journal for detailed errors:
journalctl -u postgresql@9.5-main -xe
Key things to verify:
- Data directory permissions (
/var/lib/postgresql/9.5/main) - Configuration file ownership (
/etc/postgresql/9.5/main) - Available memory (notice the HugeTLB error in manual output)
When logs remain empty, try direct execution with debug flags:
sudo -u postgres /usr/lib/postgresql/9.5/bin/postgres \
-D /var/lib/postgresql/9.5/main \
-c config_file=/etc/postgresql/9.5/main/postgresql.conf \
-c log_statement=all -c log_min_messages=debug1
When running service postgresql start on Debian 8 with PostgreSQL 9.5, the service shows as active (exited) in systemd status while no actual PostgreSQL processes are running. Manual startup via postgres binary works perfectly, indicating a systemd configuration issue rather than a PostgreSQL problem.
The root cause lies in the default service file from postgresql-common package:
[Unit]
Description=PostgreSQL RDBMS
[Service]
Type=oneshot
ExecStart=/bin/true
ExecReload=/bin/true
RemainAfterExit=on
This configuration merely runs /bin/true as a placeholder rather than actually starting PostgreSQL. The postgresql@.service template is what actually manages individual clusters.
For Debian's multi-cluster setup, you should use:
# Start all clusters
sudo systemctl start postgresql@9.5-main
# Or for a specific cluster
sudo pg_ctlcluster 9.5 main start
Check which clusters are configured:
pg_lsclusters
Create a proper systemd service override:
sudo systemctl edit postgresql.service
[Service]
Type=forking
ExecStart=/usr/bin/pg_ctlcluster 9.5 main start
ExecStop=/usr/bin/pg_ctlcluster 9.5 main stop
If issues persist:
- Check logs in
/var/log/postgresql/postgresql-9.5-main.log - Verify permissions on data directory (
/var/lib/postgresql/9.5/main) - Test with debug mode:
sudo -u postgres /usr/lib/postgresql/9.5/bin/postgres -D /var/lib/postgresql/9.5/main -c config_file=/etc/postgresql/9.5/main/postgresql.conf -d 5
For production systems, consider creating a dedicated service file:
# /etc/systemd/system/postgresql-9.5.service
[Unit]
Description=PostgreSQL 9.5 Database Server
After=network.target
[Service]
Type=forking
User=postgres
ExecStart=/usr/lib/postgresql/9.5/bin/pg_ctl start -D /var/lib/postgresql/9.5/main -l /var/log/postgresql/postgresql-9.5-main.log -s -o "-c config_file=/etc/postgresql/9.5/main/postgresql.conf"
ExecStop=/usr/lib/postgresql/9.5/bin/pg_ctl stop -D /var/lib/postgresql/9.5/main -s -m fast
ExecReload=/usr/lib/postgresql/9.5/bin/pg_ctl reload -D /var/lib/postgresql/9.5/main -s
TimeoutSec=300
[Install]
WantedBy=multi-user.target