Skip to content

Instantly share code, notes, and snippets.

@immunda
Created April 30, 2012 16:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save immunda/2559909 to your computer and use it in GitHub Desktop.
Save immunda/2559909 to your computer and use it in GitHub Desktop.
Postgres init script
# This file contains common functionality for all postgresql server
# package init.d scripts. It is usually included by
# /etc/init.d/postgresql-X.Y.
. /lib/lsb/init-functions
# do pg_ctlcluster action $1 to all clusters of version $2 with command
# description $3; output according to Debian Policy for init scripts
do_ctl_all() {
[ "$1" ] || { echo "Error: invalid command '$1'" >&2; exit 1; }
[ "$2" ] || { echo "Error: invalid version '$2'" >&2; exit 1; }
[ -d "/etc/postgresql/$2" ] || return 0
[ "$(ls /etc/postgresql/$2)" ] || return 0
[ -x "/usr/lib/postgresql/$2/bin/postmaster" ] || return 0
status=0
log_daemon_msg "$3"
for c in /etc/postgresql/"$2"/*; do
[ -e "$c/postgresql.conf" ] || continue
name=$(basename "$c")
# evaluate start.conf
if [ -e "$c/start.conf" ]; then
start=$(sed 's/#.*$//; /^[[:space:]]*$/d; s/^\s*//; s/\s*$//' "$c/start.conf")
else
start=auto
fi
[ "$start" = "auto" ] || continue
log_progress_msg "$name"
set +e
if [ "$1" = "stop" ] || [ "$1" = "restart" ]; then
ERRMSG=$(pg_ctlcluster --force "$2" "$name" $1 2>&1)
else
ERRMSG=$(pg_ctlcluster "$2" "$name" $1 2>&1)
fi
res=$?
set -e
# Do not fail on success or if cluster is already/not running
[ $res -eq 0 ] || [ $res -eq 2 ] || status=$(($status || $res))
done
if [ $status -ne 0 -a -n "$ERRMSG" ]; then
log_failure_msg "$ERRMSG"
fi
log_end_msg $status
return $status
}
# start all clusters of version $1
# output according to Debian Policy for init scripts
start() {
# create socket directory
if [ -d /var/run/postgresql ]; then
chmod 2775 /var/run/postgresql
else
install -d -m 2775 -o postgres -g postgres /var/run/postgresql
fi
do_ctl_all start "$1" "Starting PostgreSQL $1 database server"
}
# stop all clusters of version $1
# output according to Debian Policy for init scripts
stop() {
do_ctl_all stop "$1" "Stopping PostgreSQL $1 database server"
}
# restart all clusters of version $1
# output according to Debian Policy for init scripts
restart() {
do_ctl_all restart "$1" "Restarting PostgreSQL $1 database server"
}
# reload all clusters of version $1
# output according to Debian Policy for init scripts
reload() {
do_ctl_all reload "$1" "Reloading PostgreSQL $1 database server"
}
status() {
CLUSTERS=`pg_lsclusters -h | grep "^$1[[:space:]]"`
# no clusters -> unknown status
[ -n "$CLUSTERS" ] || exit 4
echo "$CLUSTERS" | awk 'BEGIN {rc=0; printf("Running clusters: ")} {if ($4 == "online") printf ("%s/%s ", $1, $2); else rc=3} END { printf("\n"); exit rc }'
}
phil@zoot:/usr/share/postgresql-common$ ^C
phil@zoot:/usr/share/postgresql-common$
phil@zoot:/usr/share/postgresql-common$ cat init.d-functions
# This file contains common functionality for all postgresql server
# package init.d scripts. It is usually included by
# /etc/init.d/postgresql-X.Y.
. /lib/lsb/init-functions
# do pg_ctlcluster action $1 to all clusters of version $2 with command
# description $3; output according to Debian Policy for init scripts
do_ctl_all() {
[ "$1" ] || { echo "Error: invalid command '$1'" >&2; exit 1; }
[ "$2" ] || { echo "Error: invalid version '$2'" >&2; exit 1; }
[ -d "/etc/postgresql/$2" ] || return 0
[ "$(ls /etc/postgresql/$2)" ] || return 0
[ -x "/usr/lib/postgresql/$2/bin/postmaster" ] || return 0
status=0
log_daemon_msg "$3"
for c in /etc/postgresql/"$2"/*; do
[ -e "$c/postgresql.conf" ] || continue
name=$(basename "$c")
# evaluate start.conf
if [ -e "$c/start.conf" ]; then
start=$(sed 's/#.*$//; /^[[:space:]]*$/d; s/^\s*//; s/\s*$//' "$c/start.conf")
else
start=auto
fi
[ "$start" = "auto" ] || continue
log_progress_msg "$name"
set +e
if [ "$1" = "stop" ] || [ "$1" = "restart" ]; then
ERRMSG=$(pg_ctlcluster --force "$2" "$name" $1 2>&1)
else
ERRMSG=$(pg_ctlcluster "$2" "$name" $1 2>&1)
fi
res=$?
set -e
# Do not fail on success or if cluster is already/not running
[ $res -eq 0 ] || [ $res -eq 2 ] || status=$(($status || $res))
done
if [ $status -ne 0 -a -n "$ERRMSG" ]; then
log_failure_msg "$ERRMSG"
fi
log_end_msg $status
return $status
}
# start all clusters of version $1
# output according to Debian Policy for init scripts
start() {
# create socket directory
if [ -d /var/run/postgresql ]; then
chmod 2775 /var/run/postgresql
else
install -d -m 2775 -o postgres -g postgres /var/run/postgresql
fi
do_ctl_all start "$1" "Starting PostgreSQL $1 database server"
}
# stop all clusters of version $1
# output according to Debian Policy for init scripts
stop() {
do_ctl_all stop "$1" "Stopping PostgreSQL $1 database server"
}
# restart all clusters of version $1
# output according to Debian Policy for init scripts
restart() {
do_ctl_all restart "$1" "Restarting PostgreSQL $1 database server"
}
# reload all clusters of version $1
# output according to Debian Policy for init scripts
reload() {
do_ctl_all reload "$1" "Reloading PostgreSQL $1 database server"
}
status() {
CLUSTERS=`pg_lsclusters -h | grep "^$1[[:space:]]"`
# no clusters -> unknown status
[ -n "$CLUSTERS" ] || exit 4
echo "$CLUSTERS" | awk 'BEGIN {rc=0; printf("Running clusters: ")} {if ($4 == "online") printf ("%s/%s ", $1, $2); else rc=3} END { printf("\n"); exit rc }'
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment