Systemd skrypt startowy postgresql

14

Jestem w trakcie instalowania postgresql na drugim serwerze

Wcześniej zainstalowałem postgresql, a następnie użyłem dostarczonego skryptu

./contrib/start-scripts/linux

Umieszczony we właściwym reż

# cp ./contrib/start-scripts/linux /etc/rc.d/init.d/postgresql92
# chmod 755 /etc/rc.d/init.d/postgresql92

Które mogłem następnie wykonać zgodnie z oczekiwaniami

# service postgresql92 start

Jednak nowa maszyna używa Systemd i wygląda na to, że jest to zupełnie inny sposób

Nie chcę zhakować tego i zrujnować coś, więc zastanawiałem się, czy ktoś tam mógłby skierować mnie w dobrym kierunku, jak osiągnąć ten sam wynik

TheLovelySausage
źródło

Odpowiedzi:

21

Podczas instalacji ze źródła należy dodać plik jednostkowy systemowy, który działa z instalacją źródłową. W przypadku RHEL plik mojej jednostki Fedory wygląda następująco:

/usr/lib/systemd/system/postgresql.service

[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
Type=forking

User=postgres
Group=postgres

# 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
# ... but allow it still to be effective for child processes
# (note that these settings are ignored by Postgres releases before 9.5)
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0

# Maximum number of seconds pg_ctl will wait for postgres to start.  Note that
# PGSTARTTIMEOUT should be less than TimeoutSec value.
Environment=PGSTARTTIMEOUT=270

Environment=PGDATA=/usr/local/pgsql/data


ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -s -w -t ${PGSTARTTIMEOUT}
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA} -s

# Give a reasonable amount of time for the server to start up/shut down.
# Ideally, the timeout for starting PostgreSQL server should be handled more
# nicely by pg_ctl in ExecStart, so keep its timeout smaller than this value.
TimeoutSec=300

[Install]
WantedBy=multi-user.target

Następnie włącz usługę podczas uruchamiania i uruchom usługę PostgreSQL:

$ sudo systemctl daemon-reload # load the updated service file from disk
$ sudo systemctl enable postgresql
$ sudo systemctl start postgresql
NoelProf
źródło
6
# systemctl start postgresql.service

Niektóre środowiska przekłada service <name> startsię systemctl start <name>.service, ale nie muszą polegać na nim.

Emeryczny
źródło
Ale gdzie miałbym umieścić skrypt postgresql92?
TheLovelySausage
Nie używasz go już w systemd. Twoja dystrybucja powinna dostarczyć ci plik usługi systemowej postgresql, abyś mógł uruchomić usługę.
Emeric
Postgresql został jednak zainstalowany ze źródła, nie używając dnf, ponieważ muszę zainstalować 3 wersje postgres w określonych katalogach, czy można użyć dostarczonego pliku linux start-scripts do uruchomienia postgresql?
TheLovelySausage
Moja dystrybucja dodaje ten skrypt jako /usr/lib/systemd/system/postgresql.service. Wydaje się, że skrypty startowe dostarczone przez postgresql obejmują tylko SysV.
Emeric
czy zainstalowałeś postgres używając dnf lub yum?
TheLovelySausage
0

Wysłany powyżej plik jednostki systemctl bardzo mi pomaga, ale aby stworzyć ten, którego potrzebujesz, musisz go po prostu założyć:

/etc/systemd/system/postgresql92.service
systemctl enable postgresql92.service
systemctl start postgresql92.service

Pomyśl o zmianie ścieżki binay pg_ctl zgodnie z instalacją, a jeśli chcesz uruchomić inną instancję, musisz również zmienić domyślny port nasłuchiwania:

ExecStart=/usr/local/pgsql/bin/pg_ctl -o "-p 5489"
Bertrand Cebador
źródło