in practice make the sleep longer
[mirror/dsa-puppet.git] / modules / postgres / files / dsa-restart-all-idle-postgres
1 #! /bin/bash
2
3 # Written by Peter Palfrader
4 # Based on code by Tollef Fog Heen <tfheen@err.no> based on code by Peter Palfrader
5 #
6 # Restart all postgresql clusters when they do not have connections to them.
7
8 set -e
9 set -u
10
11 # chk_net <port>
12 # returns true (0) if there are connections to that port.
13 chk_net() {
14   local port="$1"; shift
15   local con="$(ss -H -nt "sport = :$port" | wc -l)"
16   if [ "$con" -ge 1 ]; then
17     return 0
18   else
19     return 1
20   fi
21 }
22
23 get_pidfile_value() {
24   local version="$1"; shift
25   local name="$1"; shift
26
27   local fn="/run/postgresql/${version}-${name}.pid"
28   if [ -e "$fn" ] ; then
29     cat "$fn"
30   else
31     echo "No pidfile at $fn" >&2
32     exit 1
33   fi
34 }
35
36 handle_cluster() {
37   local version="$1"; shift
38   local name="$1"; shift
39   local port="$1"; shift
40
41   pid="$(get_pidfile_value "$version" "$name")"
42   while chk_net "$port" && [ "$pid" = "$(get_pidfile_value "$version" "$name")" ]; do
43     sleep 60
44   done
45   systemctl restart "postgresql@${version}-${name}.service"
46 }
47
48 pg_lsclusters -h | while read version name port status; do
49   echo "$status" | grep -q --word-regexp online || continue
50   handle_cluster $version $name $port &
51 done
52
53 wait