Installed PostgreSQL 10 by a normal user.
Enabled and started its service:
sudo systemctl start postgresql-10
sudo systemctl enable postgresql-10
Then login with postgres
user:
sudo su - postgres
Add this setting to .bash_profile
file:
export PATH=$PATH:/usr/pgsql-10/bin/
Restart PostgreSQL by pg_ctl
:
-bash-4.2$ pg_ctl restart
Then exit to normal user and check postgresql's status again, it failed. Even use this way to restart can't success:
sudo systemctl restart postgresql-10
sudo systemctl stop postgresql-10
It always failed
.
But if I use postgres
user to test restart, stop, start, all of them can success.
These 2 ways aren't controlling the same process?
Add postgresql-10 service content
$ sudo systemctl cat postgresql-10.service
# /usr/lib/systemd/system/postgresql-10.service
# It's not recommended to modify this file in-place, because it will be
# overwritten during package upgrades. If you want to customize, the
# best way is to create a file "/etc/systemd/system/postgresql-10.service",
# containing
# .include /usr/lib/systemd/system/postgresql-10.service
# ...make your changes here...
# For more info about custom unit files, see
# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F
# Note: changing PGDATA will typically require adjusting SELinux
# configuration as well.
# Note: do not use a PGDATA pathname containing spaces, or you will
# break postgresql-setup.
[Unit]
Description=PostgreSQL 10 database server
Documentation=https://www.postgresql.org/docs/10/static/
After=syslog.target
After=network.target
[Service]
Type=notify
User=postgres
Group=postgres
# Note: avoid inserting whitespace in these Environment= lines, or you may
# break postgresql-setup.
# Location of database directory
Environment=PGDATA=/var/lib/pgsql/10/data/
# Where to send early-startup messages from the server (before the logging
# options of postgresql.conf take effect)
# This is normally controlled by the global default set by systemd
# StandardOutput=syslog
# Disable OOM kill on the postmaster
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0
ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir ${PGDATA}
ExecStart=/usr/pgsql-10/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
# Do not set any timeout value, so that systemd will not kill postmaster
# during crash recovery.
TimeoutSec=0
[Install]
WantedBy=multi-user.target
Best Answer
If you start the server manually using
pg_ctl
,systemd
doesn't know about it.It will happily try to start the server, which will fail (because the server is already running), and it cannot stop the server, because it does not know it is running.
So always use
systemctl
when starting and stopping the service. Reloading withpg_ctl reload
is fine.