7 Reference - Linux Service Script

Table of Contents Previous Next


7 Reference - Linux Service Script

#!/bin/bash
#
# chkconfig: 2345 85 15
# description: Starts and stops the PostgreSQL/Postgres Plus Advanced Server database server

# PostgreSQL/Postgres Plus Advanced Server Service script template for Linux
# Please modify the values accordingly

DB_DESC="Database Server - PostgreSQL 9.5"
DB_INSTALL_DIR=/opt/PostgreSQL/9.5
DB_BIN_DIR=${DB_INSTALL_DIR}/bin
DB_LIB_DIR=${DB_INSTALL_DIR}/lib
DB_DATA_DIR=${DB_INSTALL_DIR}/data
DB_HBA_FILE=${DB_DATA_DIR}/pg_hba.conf
DB_CONF_FILE=${DB_DATA_DIR}/postgresql.conf
DB_PID_FILE=${DB_DATA_DIR}/postmaster.pid
DB_STARTUP_LOG=${DB_DATA_DIR}/pg_log/startup.log
DB_SERVICE_USER=postgres

_die()
{
echo ""
echo "FATAL ERROR: $*"
echo ""
exit 1
}

if [ `id -u` != 0 ]; then
_die "You must run this script as the root."
fi

# Source function library.
if [ -f /etc/rc.d/functions ];
then
. /etc/init.d/functions
fi

start()
{
STARTDBSERVER=0
if [ -e "${DB_PID_FILE}" ]
then
PIDOFDB=`head -n 1 "${DB_PID_FILE}"`
PIDALIVEDB=""
if [ -n "${DB_PID_FILE}" ]; then
PIDALIVEDB=`ps -p "${PIDOFDB}" | grep "${PIDOFDB}"`
fi

if [ -n "${PIDALIVEDB}" ]
then
echo "The '${DB_DESC}' is already running. PID(${PIDALIVEDB})."
exit
else
STARTDBSERVER=1
fi
else
STARTDBSERVER=1
fi

if [ "${STARTDBSERVER}" != 0 ]
then
echo "Starting ${DB_DESC}..."
su - "${DB_SERVICE_USER}" -c "LD_LIBRARY_PATH=\"${DB_LIB_DIR}:\$LD_LIBRARY_PATH\" \"${DB_BIN_DIR}/pg_ctl\" -w start -D \"${DB_DATA_DIR}\" -l \"${DB_STARTUP_LOG}\" -o \"${DB_STARTUP_OPTIONS}\""

if [ $? -eq 0 ];
then
echo "${DB_DESC} started successfully."
exit 0
else
echo "${DB_DESC} did not start in a timely fashion, please see '${DB_STARTUP_LOG}' for details."
exit 1
fi
fi
}

stop()
{
if [ -e "${DB_PID_FILE}" ]
then
PIDOFDB=`head -n 1 "${DB_PID_FILE}"`
PIDALIVEDB=""
if [ -n "${DB_PID_FILE}" ]; then
PIDALIVEDB=`ps -p "${PIDOFDB}" | grep "${PIDOFDB}"`
fi

if [ -n "${PIDALIVEDB}" ]
then
echo "Stopping ${DB_DESC}..."
su - "${DB_SERVICE_USER}" -c "LD_LIBRARY_PATH=\"${DB_LIB_DIR}:\$LD_LIBRARY_PATH\" \"${DB_BIN_DIR}/pg_ctl\" stop -m fast -D \"${DB_DATA_DIR}\" -l \"${DB_STARTUP_LOG}\" -o \"${DB_STARTUP_OPTIONS}\""
else
echo "The '${DB_DESC}' is not running."
fi
else
echo "The '${DB_DESC}' is not running."
fi
}

reload()
{
echo "Reloading '${DB_DESC}'..."
su - "${DB_SERVICE_USER}" -c "LD_LIBRARY_PATH=\"${DB_LIB_DIR}:\$LD_LIBRARY_PATH\" \"${DB_BIN_DIR}/pg_ctl\" reload -D \"${DB_DATA_DIR}\" -l \"${DB_STARTUP_LOG}\" -o \"${DB_STARTUP_OPTIONS}\""
}

restart()
{
echo "Restarting '${DB_DESC}'..."
su - "${DB_SERVICE_USER}" -c "LD_LIBRARY_PATH=\"${DB_LIB_DIR}:\$LD_LIBRARY_PATH\" \"${DB_BIN_DIR}/pg_ctl\" restart -m fast -w -D \"${DB_DATA_DIR}\" -l \"${DB_STARTUP_LOG}\" -o \"${DB_STARTUP_OPTIONS}\""

if [ $? -eq 0 ];
then
echo "'${DB_DESC}' restarted successfully."
exit 0
else
echo "'${DB_DESC}' did not start in a timely fashion, please see '${DB_STARTUP_LOG}' for details."
exit 1
fi
}

_die_incomplete_requirement()
{
echo "One or more required configuration variables are not set:"
_die $*
}

_validate_script()
{
if [ -z "${DB_INSTALL_DIR}" ]; then
_die_incomplete_requirement "Missing installation directory";
fi
if [ ! -d "${DB_INSTALL_DIR}" ]; then
_die_incomplete_requirement "The specified - '${DB_INSTALL_DIR}' is not a valid installation directory. It is not present on the system.";
fi

if [ -z "${DB_BIN_DIR}" ]; then DB_BIN_DIR=${DB_INSTALL_DIR}/bin; fi
if [ ! -d "${DB_BIN_DIR}" ]; then
_die_incomplete_requirement "The specified - '${DB_BIN_DIR}' is not a valid bin directory. It is not present on the system.";
fi
if [ ! -f "${DB_BIN_DIR}/pg_config" -o ! -f "${DB_BIN_DIR}/pg_ctl" ]; then
_die_incomplete_requirement "The specified - '${DB_BIN_DIR}' does not contain the database server binaries.";
fi

if [ -z "${DB_LIB_DIR}" ]; then DB_LIB_DIR=${DB_INSTALL_DIR}/lib; fi
if [ -z "${DB_DESC}" ]; then DB_DESC=`${DB_BIN_DIR}/pg_config --version`; fi

if [ -z "${DB_DATA_DIR}" ]; then
_die_incomplete_requirement "Missing data directory settings in the script. Please set 'DB_DATA_DIR' variable in the script.";
fi

if [ ! -d "${DB_DATA_DIR}" ]; then
_die_incomplete_requirement "The specified - '${DB_DATA_DIR}' is not a valid. It is not present on the system.";
fi
if [ ! -f "${DB_DATA_DIR}/PG_VERSION" -o ! -d "${DB_DATA_DIR}/base" -o ! -d "${DB_DATA_DIR}/global" ]; then
_die_incomplete_requirement "The directory - '${DB_DATA_DIR}' does not look like a valid PostgreSQL/Postgres Plus Advanced Server data directory."
fi
if [ -z "${DB_SERVICE_USER}" ]; then
_die_incomplete_requirement "The service-user is not specified in the service script. Please set 'DB_SERVICE_USER' variable in the script."
fi
DB_VALID_SERVICE_USER=`cat /etc/passwd | grep "^${DB_SERVICE_USER}:"`
if [ -z "${DB_VALID_SERVICE_USER}" ]; then
_die_incomplete_requirement "The service-user '${DB_SERVICE_USER}' is not present on the system. Please specify the correct information."
fi
DB_DATA_DIR_OWNER=`ls -l ${DB_DATA_DIR}/PG_VERSION | awk '{print $3}'`
if [ x"${DB_DATA_DIR_OWNER}" != x"${DB_SERVICE_USER}" ]; then
_die_incomplete_requirement "The specified user - '${DB_SERVICE_USER}' does not own the data directory - '${DB_DATA_DIR}'. The data directory is owned by the user - '${DB_DATA_DIR_OWNER}'."
fi
if [ -z "${DB_HBA_FILE}" ]; then DB_HBA_FILE=${DB_DATA_DIR}/pg_hba.conf; fi
if [ ! -f "${DB_HBA_FILE}" ]; then
_die_incomplete_requirement "The hba-file - '${DB_HBA_FILE}' does not exist."
fi
if [ -z "${DB_CONF_FILE}" ]; then DB_CONF_FILE=${DB_DATA_DIR}/postgresql.conf; fi
if [ ! -f "${DB_CONF_FILE}" ]; then
_die_incomplete_requirement "The config-file - '${DB_CONF_FILE}' does not exist."
fi
if [ -z "${DB_PID_FILE}" ]; then DB_PID_FILE=${DB_DATA_DIR}/postmaster.pid; fi
if [ -z "${DB_STARTUP_LOG}" ]; then DB_STARTUP_LOG=${DB_DATA_DIR}/pg_log/startup.log; fi

DB_STARTUP_OPTIONS=""
if [ x"${DB_CONF_FILE}" != x"${DB_DATA_DIR}/postgresql.conf" ]; then
DB_STARTUP_OPTIONS="-c 'config_file=${DB_CONF_FILE}'"
fi
if [ x"${DB_HBA_FILE}" != x"${DB_DATA_DIR}/pg_hba.conf" ]; then
DB_STARTUP_OPTIONS="${DB_STARTUP_OPTIONS} -c 'hba_file=${DB_HBA_FILE}'"
DB_STARTUP_OPTIONS="${DB_STARTUP_OPTIONS} -c 'external_pid_file=${DB_PID_FILE}'"
fi

if [ x"${DEBUG_VALIDATION}" = x"1" ]; then
echo "Using these values in the scripts:"
echo ""
echo "DB_DESC : ${DB_DESC}"
echo ""
echo "DB_INSTALL_DIR : ${DB_INSTALL_DIR}"
echo "DB_BIN_DIR : ${DB_BIN_DIR}"
echo "DB_LIB_DIR : ${DB_LIB_DIR}"
echo ""
echo "DB_DATA_DIR : ${DB_DATA_DIR}"
echo "DB_HBA_FILE : ${DB_HBA_FILE}"
echo "DB_CONF_FILE : ${DB_CONF_FILE}"
echo "DB_PID_FILE : ${DB_PID_FILE}"
echo "DB_STARTUP_LOG : ${DB_STARTUP_LOG}"
echo ""
echo "DB_SERVICE_USER : ${DB_SERVICE_USER}"
echo "DB_STARTUP_OPTIONS : ${DB_STARTUP_OPTIONS}"
echo ""
fi
}

DEBUG_VALIDATION=0
# See how we were called.
case "$1" in
start)
_validate_script
start
;;
stop)
_validate_script
stop
;;
reload)
_validate_script
reload
;;
restart)
_validate_script
restart
;;
condrestart)
_validate_script
if [ -e "${DB_PID_FILE}" ]
then
PIDOFDB=`head -n 1 "${DB_PID_FILE}"`
PIDALIVEDB=""
if [ -n "${DB_PID_FILE}" ]; then
PIDALIVEDB=`ps -p "${PIDOFDB}" | grep "${PIDOFDB}"`
fi

if [ -n "${PIDALIVEDB}" ]
then
restart
else
echo "The '${DB_DESC}' is not running."
fi
else
echo "The '${DB_DESC}' is not running."
fi
;;
status)
_validate_script
su - "${DB_SERVICE_USER}" -c "LD_LIBRARY_PATH=\"${DB_LIB_DIR}:\$LD_LIBRARY_PATH\" \"${DB_BIN_DIR}/pg_ctl\" status -D \"${DB_DATA_DIR}\" -l \"${DB_STARTUP_LOG}\" -o \"${DB_STARTUP_OPTIONS}\""
;;
validate)
DEBUG_VALIDATION=1
_validate_script
exit 0
;;
*)
echo "Usage: $0 {start|stop|restart|condrestart|reload|status|validate}"
exit 1
esac

7 Reference - Linux Service Script

Table of Contents Previous Next