ctdb-scripts: Quote some variable expansions
[nivanova/samba-autobuild/.git] / ctdb / config / debug-hung-script.sh
1 #!/bin/sh
2
3 # This script only works on Linux.  Please modify (and submit patches)
4 # for other operating systems.
5
6 [ -n "$CTDB_BASE" ] || \
7     CTDB_BASE=$(d=$(dirname "$0") ; cd -P "$d" ; dirname "$PWD")
8
9 . "${CTDB_BASE}/functions"
10
11 loadconfig ctdb
12
13 # Testing hook
14 if [ -n "$CTDB_DEBUG_HUNG_SCRIPT_LOGFILE" ] ; then
15     tmp="${CTDB_DEBUG_HUNG_SCRIPT_LOGFILE}.part"
16     exec >>"$tmp" 2>&1
17 fi
18
19 (
20     # No use running several of these in parallel if, say, "releaseip"
21     # event hangs for multiple IPs.  In that case the output would be
22     # interleaved in the log and would just be confusing.
23     flock --wait 2 9 || exit 1
24
25     echo "===== Start of hung script debug for PID=\"$1\", event=\"$2\" ====="
26
27     echo "pstree -p -a ${1}:"
28     out=$(pstree -p -a "$1")
29     echo "$out"
30
31     # Check for processes matching a regular expression and print
32     # stack staces.  This could help confirm that certain processes
33     # are stuck in certain places such as the cluster filesystem.  The
34     # regexp must separate items with "|" and must not contain
35     # parentheses.  The default pattern can be replaced for testing.
36     default_pat='exportfs|rpcinfo'
37     pat="${CTDB_DEBUG_HUNG_SCRIPT_STACKPAT:-${default_pat}}"
38     echo "$out" |
39     sed -r -n "s@.*-(.*(${pat}).*),([0-9]*).*@\3 \1@p" |
40     while read pid name ; do
41         trace=$(cat "/proc/${pid}/stack" 2>/dev/null)
42         if [ $? -eq 0 ] ; then
43             echo "---- Stack trace of interesting process ${pid}[${name}] ----"
44             echo "$trace"
45         fi
46     done
47
48     if [ "$2" != "init" ] ; then
49         echo "---- ctdb scriptstatus ${2}: ----"
50         $CTDB scriptstatus "$2"
51     fi
52
53     echo "===== End of hung script debug for PID=\"$1\", event=\"$2\" ====="
54
55     if [ -n "$CTDB_DEBUG_HUNG_SCRIPT_LOGFILE" ] ; then
56         mv "$tmp" "$CTDB_DEBUG_HUNG_SCRIPT_LOGFILE"
57     fi
58
59 ) 9>"${CTDB_SCRIPT_VARDIR}/debug-hung-script.lock"