#!/bin/bash # # @NAME_SERVICE@ # # This is the init script for starting up the PostgreSQL server. # # This script is slightly unusual in that the name of the daemon (postmaster) # is not the same as the name of the subsystem (postgresql) # # chkconfig: - 64 36 # description: PostgreSQL database server. # processname: postmaster # pidfile: /var/run/postmaster.PORT.pid ### BEGIN INIT INFO # Provides: @NAME_SERVICE@ # Required-Start: $local_fs $remote_fs $network $named $syslog $time # Required-Stop: $local_fs $remote_fs $network $named $syslog $time # Short-Description: start and stop PostgreSQL @PGVERSION@ server # Description: PostgreSQL database server ### END INIT INFO # PGVERSION is the full package version, e.g., 9.0.2 # Note: the specfile inserts the correct value during package build PGVERSION=@PGVERSION@ # PGMAJORVERSION is major version, e.g., 9.0 (this should match PG_VERSION) PGMAJORVERSION=@PGMAJORVERSION@ # PGDOCDIR is the directory containing the package's documentation # Note: the specfile inserts the correct value during package build # Distribution README file README_DIST=@README_DIST@ # Source function library. . /etc/rc.d/init.d/functions # Get network config. . /etc/sysconfig/network # postgresql-setup library . "@rawpkgdatadir@/library.sh" @SCL_SOURCE@ # Find the name of the script NAME=`basename $0` if [ ${NAME:0:1} = "S" -o ${NAME:0:1} = "K" ] then NAME=${NAME:3} fi # Set defaults for configuration variables PGENGINE=@bindir@ # Only default system service has default PGDATA set. This allows us to catch # admin's mistake of not creating /etc/sysconfig/psql/$NAME configuration file # and just hard/symlinking default init script. That way we can avoid (inside # postgresql-check-db-dir) runnnig "secondary" server against "default" data # directory. if test "@NAME_SERVICE@" = "$NAME"; then PGDATA=@PGDATADIR@ fi PGLOG=@POSTGRES_HOMEDIR@/pgstartup-@NAME_SERVICE@.log # Value to set as postmaster process's oom_adj PG_OOM_ADJ=-17 # Override defaults from /etc/sysconfig/pgsql if file is present [ -f /etc/sysconfig/pgsql/${NAME} ] && . /etc/sysconfig/pgsql/${NAME} export PGDATA export PGPORT export PGSTARTTIMEOUT export PGSCLS lockfile="/var/lock/subsys/${NAME}" # Ideally, we should use $PGDATA/postmaster.pid. It apparently works, but to # be honest I'm not sure about consequences. Most probably 'service status' # would not work for non-root/non-postgres users. TODO? pidfile="/var/run/${NAME}.pid" script_result=0 start() { [ -x "$PGENGINE/postgres" ] || exit 5 PSQL_START=$"Starting ${NAME} service: " # Make sure startup-time log file is valid if [ ! -e "$PGLOG" -a ! -h "$PGLOG" ] then touch "$PGLOG" || exit 4 chown postgres:postgres "$PGLOG" chmod go-rwx "$PGLOG" [ -x /sbin/restorecon ] && /sbin/restorecon "$PGLOG" fi @libexecdir@/postgresql-check-db-dir "$NAME" || { echo_failure echo exit 1 } echo -n "$PSQL_START" test x"$PG_OOM_ADJ" != x && echo "$PG_OOM_ADJ" > /proc/self/oom_adj # Note that this does not fail/exit the 'service start' if the postmaster # is already running. We should probably 'status' first and start only if # postmaster is down. This just unnecessarily wastes time and generates # too much (false) rush in $PGLOG. # # The maximum waiting time PGSTARTTIMEOUT is set to 30 second to not hold # the system too long. See `man pg_ctl & -w option`. This is not issue in # case of systemd. run_cmd_as_dbadmin "\ PGSCLS='${PGSCLS}' \ @libexecdir@/postgresql-ctl start -D ${PGDATA} -s \ -w -t ${PGSTARTTIMEOUT-30}" \ "$PGLOG" "$PGLOG" if test $? -ne 0; then failure "$PSQL_START" echo script_result=1 return fi pid=`head -n 1 "$PGDATA/postmaster.pid" 2>/dev/null` if [ "x$pid" != x ] then success "$PSQL_START" touch "$lockfile" echo $pid > "$pidfile" echo else failure "$PSQL_START" echo script_result=1 fi } stop() { echo -n $"Stopping ${NAME} service: " if [ -e "$lockfile" ] then run_cmd_as_dbadmin \ "$PGENGINE/pg_ctl stop -D '$PGDATA' -s -m fast" \ /dev/null /dev/null ret=$? if [ $ret -eq 0 ] then echo_success rm -f "$pidfile" rm -f "$lockfile" else echo_failure script_result=1 fi else # not running; per LSB standards this is "ok" echo_success fi echo } restart(){ stop start } condrestart(){ [ -e "$lockfile" ] && restart || : } reload() { run_cmd_as_dbadmin "$PGENGINE/pg_ctl reload -D '$PGDATA' -s" \ /dev/null /dev/null } __single_comand() { local msg="$1" shift echo $"$msg ($@)" "$@" && success || failure || script_result=1 echo } initdb() { __single_comand $"Initializing database" \ @bindir@/@NAME_BINARYBASE@-setup --initdb --unit "$NAME" "$@" } upgrade() { __single_comand $"Upgrading database" \ @bindir@/@NAME_BINARYBASE@-setup --upgrade --unit "$NAME" "$@" } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p "$pidfile" postgres script_result=$? ;; restart) restart ;; condrestart|try-restart) condrestart ;; reload) reload ;; force-reload) restart ;; initdb) shift initdb "$@" ;; upgrade) shift upgrade "$@" ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|initdb|upgrade}" exit 2 esac exit $script_result