summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Brolley <brolley@redhat.com>2009-12-08 11:51:45 -0500
committerDave Brolley <brolley@redhat.com>2009-12-08 11:51:45 -0500
commitfd0a75c3bc3ce806eb89eea1f346ba62ca1999d4 (patch)
tree6e546bf5d9d6e8be14a38d7003c96f6e27e70735
parent6bb613f9be856632dec47cab4b27a7fe92c2fe64 (diff)
downloadsystemtap-steved-fd0a75c3bc3ce806eb89eea1f346ba62ca1999d4.tar.gz
systemtap-steved-fd0a75c3bc3ce806eb89eea1f346ba62ca1999d4.tar.xz
systemtap-steved-fd0a75c3bc3ce806eb89eea1f346ba62ca1999d4.zip
PR 10905 Ground Work: Save server status as PID files with the server config as contents.
-rw-r--r--initscript/stap-server.in359
1 files changed, 210 insertions, 149 deletions
diff --git a/initscript/stap-server.in b/initscript/stap-server.in
index 48808eb4..69b43785 100644
--- a/initscript/stap-server.in
+++ b/initscript/stap-server.in
@@ -33,10 +33,6 @@ LOG_FILE=/var/log/stap-server.log
STAP_USER=stap-server
# Default option settings
-# Target architecture
-OPT_KERNEL_ARCH=`stap_get_arch`
-# A list of release_arch pairs
-OPT_SERVER_LIST=
# Optional global config file
OPT_CONFIG_FILE=
@@ -121,7 +117,7 @@ parse_args () { # arguments
while [ -n "$1" ]; do
case "$1" in
-a)
- OPT_KERNEL_ARCH=$2
+ OPT_SERVER_CMDS="$OPT_SERVER_CMDS ARCH='$2'"
shift 1
;;
-c)
@@ -151,16 +147,12 @@ parse_args () { # arguments
# Process the -i flag.
process_i () {
- local save_arch=$OPT_KERNEL_ARCH
- OPT_KERNEL_ARCH=`stap_get_arch`
-
cd /lib/modules
local release
for release in `ls`; do
process_r $release
done
- OPT_KERNEL_ARCH=$save_arch
return 0
}
@@ -178,33 +170,15 @@ process_r () {
echo "Missing $version_file_name"
return 1
fi
- OPT_SERVER_LIST="$OPT_SERVER_LIST ${kernel_release}_${OPT_KERNEL_ARCH}"
+ OPT_SERVER_CMDS="$OPT_SERVER_CMDS RELEASE='$kernel_release'"
return 0
fi
# kernel release specified directly
- OPT_SERVER_LIST="$OPT_SERVER_LIST ${1}_${OPT_KERNEL_ARCH}"
+ OPT_SERVER_CMDS="$OPT_SERVER_CMDS RELEASE='$1'"
return 0
}
-# Default to the currently running kernel release
-get_release () { # server-spec
- if [ -z "$1" ]; then
- $UNAME -r
- else
- expr "$1" : '\(.*\)_.*'
- fi
-}
-
-# Default to the currently running kernel release
-get_arch () { # server-spec
- if [ -z "$1" ]; then
- stap_get_arch
- else
- expr "$1" : '.*_\(.*\)'
- fi
-}
-
load_config () {
# Include configs
if [ -f "$CONFIG_FILE" ]; then
@@ -215,8 +189,18 @@ load_config () {
fi
}
+# Default to the currently running kernel release
+get_release () {
+ $UNAME -r
+}
+
+# Default to the currently running kernel release
+get_arch () {
+ stap_get_arch
+}
+
load_server_config () {
- CONFIG_OPTS=
+ CONFIG_SERVER_CMDS=
for f in "$CONFIG_PATH"/*.conf; do
if [ -f "$f" ]; then
# Obtain an architecture and release from each config file.
@@ -227,7 +211,7 @@ load_server_config () {
. "$f"
[ -z "$ARCH" ] && ARCH=`get_arch`
[ -z "$RELEASE" ] && RELEASE=`get_release`
- CONFIG_OPTS="$CONFIG_OPTS -a $ARCH -r $RELEASE"
+ CONFIG_SERVER_CMDS="$CONFIG_SERVER_CMDS ARCH='$ARCH' RELEASE='$RELEASE'"
fi
done
}
@@ -244,16 +228,38 @@ stat_file () { # server-spec
echo $STAT_PATH/$1
}
-default_server_list () {
- echo "`get_release`_`get_arch`"
+default_server_cmds () {
+ echo "RELEASE='`get_release`'"
}
-check_server_running () { # server-spec
- local server_status=`stat_file $1`
- test ! -f $server_status && return 1
- (ps -e | grep stap-serverd | grep -q `cat $server_status`) || return 1
- # Server is already running
- return 0
+init_server_opts () {
+ ARCH=`get_arch`
+}
+
+server_still_running () { # PID
+ (ps -e | grep stap-serverd | grep -q $1) && return 0 # Still running
+
+ rm -f $STAT_PATH/$1
+ return 1 # Not running
+}
+
+get_server_pid () {
+ local target_release="$RELEASE"
+ local target_arch="$ARCH"
+
+ # Check the status file for each running server to see if it matches
+ # the one currently configured.
+ for f in $STAT_PATH/*; do
+ test ! -e $f && continue
+ . $f
+ test "$RELEASE" = "$target_release" || continue
+ test "$ARCH" = "$target_arch" || continue
+ echo `basename $f` # Server has a pid
+ return
+ done
+
+ RELEASE="$target_release"
+ ARCH="$target_arch"
}
managed_servers () {
@@ -271,7 +277,7 @@ managed_servers () {
echo "$list"
}
-start () { # server-list
+start () { # server-cmds
prepare_stat_dir
if [ $? -ne 0 ]; then
do_failure $"Failed to make stat directory ($STAT_PATH)"
@@ -279,91 +285,117 @@ start () { # server-list
fi
# Start the specified servers
- local server_list="$1"
+ server_cmds="$1"
# If none specified, start the configured servers
- if [ -z "$server_list" ]; then
+ if [ -z "$server_cmds" ]; then
load_server_config
- parse_args $CONFIG_OPTS || exit 2
- server_list="$OPT_SERVER_LIST"
+ server_cmds="$CONFIG_SERVER_CMDS"
# If none configured, start the default servers
- [ -z "$server_list" ] && server_list=`default_server_list`
+ [ -z "$server_cmds" ] && server_cmds=`default_server_cmds`
fi
# Start each requested server in turn
local rc=0
- local spec
local first=1
- for spec in $server_list; do
- local release=`get_release $spec`
- local arch=`get_arch $spec`
+ init_server_opts
+ for cmd in $server_cmds; do
+ # Evaluate commands until the RELEASE= command is found.
+ eval $cmd
+ echo $cmd | grep -q ^RELEASE || continue
test $first = 0 && echo
first=0
- clog $"Starting $prog for $release $arch: " -n
+ clog $"Starting $prog for $RELEASE $ARCH: " -n
# Is there already a server running for the requested kernel release
# and arch?
- if check_server_running $spec; then
- do_success $"$prog start for $release $arch"
- continue
+ local server_pid=`get_server_pid`
+ if test -n "$server_pid"; then
+ if server_still_running $server_pid; then
+ do_success $"$prog start for $RELEASE $ARCH"
+ continue
+ fi
fi
# Start the server here.
- local server_status=`stat_file $spec`
- runuser -s /bin/bash - $STAP_USER -c "$STAP_START_SERVER -r $release -a $arch --log=$LOG_FILE" > $server_status
+ local server_status_file=$STAT_PATH/`runuser -s /bin/bash - $STAP_USER \
+ -c "$STAP_START_SERVER -r $RELEASE -a $ARCH --log=$LOG_FILE"`
if [ $? != 0 ]; then
- rm -f $server_status
- do_failure $"$prog start: unable to start stap-server for $release $arch"
+ rm -f $server_status_file
+ do_failure $"$prog start: unable to start stap-server for $RELEASE $ARCH"
rc=1
continue
fi
+ echo "ARCH=$ARCH" > $server_status_file
+ echo "RELEASE=$RELEASE" >> $server_status_file
- do_success $"$prog start for $release $arch"
+ do_success $"$prog start for $RELEASE $ARCH"
done
return $rc
}
-stop () { # server-list
- local server_status
- local server_list
+stop () { # server-cmds
local first=1
+ local server_list=
+ server_cmds="$1"
+ if [ -n "$server_cmds" ]; then
+ # Get the pids of all the requested servers.
+ init_server_opts
+ for cmd in $server_cmds; do
+ # Evaluate commands until the RELEASE= command is found.
+ eval $cmd
+ echo $cmd | grep -q ^RELEASE || continue
+
+ # Get the pid for this server, if it's running
+ local server_pid=`get_server_pid`
+ if test -n "$server_pid"; then
+ server_list="$server_list $server_pid"
+ continue
+ fi
- # Stop the specified servers or all servers, if none specified.
- server_list="$1"
- [ -z "$server_list" ] && server_list=`managed_servers`
-
- # No server specified or running?
+ # This server is not running, but give a success stop status anyway.
+ test $first = 0 && echo
+ first=0
+ clog $"Stopping $prog for $RELEASE $ARCH: " -n
+ do_success $"$prog stop for $release_arch"
+ done
+ fi
if [ -z "$server_list" ]; then
- clog $"Stopping $prog: " -n
- do_success $"$prog: No managed servers to stop"
- return 0
+ # If there was a non-existent server specified, then we're done
+ test $first = 0 && return 0
+
+ server_list=`managed_servers`
+ if [ -z "$server_list" ]; then
+ clog $"Stopping $prog: " -n
+ do_success $"$prog: No managed servers to stop"
+ return 0
+ fi
fi
# Stop each server in turn
local rc=0
- for server_status in $server_list; do
- release_arch=`echo $server_status | sed 's/_/ /'`
+ local pid
+ for pid in $server_list; do
+ . $STAT_PATH/$pid
test $first = 0 && echo
first=0
- clog $"Stopping $prog for $release_arch: " -n
+ clog $"Stopping $prog for $RELEASE $ARCH: " -n
local this_rc=0
- local server_status_file=`stat_file $server_status`
- if check_server_running $server_status; then
- local pid=`cat $server_status_file`
+ if server_still_running $pid; then
runuser -s /bin/bash - $STAP_USER -c "$STAP_STOP_SERVER $pid"
if [ $? != 0 ]; then
- do_failure $"$prog start: unable to start stap-server for $release $arch"
+ do_failure $"$prog stop: unable to stop stap-server for $RELEASE $ARCH"
this_rc=1
rc=1
fi
fi
if [ $this_rc = 0 ]; then
- rm -f $server_status_file
- do_success $"$prog stop for $release_arch"
+ rm -f $STAT_PATH/$pid
+ do_success $"$prog stop for $RELEASE $ARCH"
fi
done
@@ -371,58 +403,75 @@ stop () { # server-list
}
status () { # server-list
- local server_list
local rc=0
- # Report status for the specified servers or all servers, if none specified.
- server_list="$1"
- [ -z "$server_list" ] && server_list=`managed_servers`
-
- # No server specified or running?
+ # Report status for the specified servers or all running servers, if none
+ # specified.
+ local server_list=
+ server_cmds="$1"
+ if [ -n "$server_cmds" ]; then
+ # Get the pids of all the requested servers.
+ init_server_opts
+ for cmd in $server_cmds; do
+ # Evaluate commands until the RELEASE= command is found.
+ eval $cmd
+ echo $cmd | grep -q ^RELEASE || continue
+
+ # Get the pid for this server, if it's running
+ local server_pid=`get_server_pid`
+ if test -n "$server_pid"; then
+ server_list="$server_list $server_pid"
+ continue
+ fi
+ # This server is not running
+ echo "stap-server for $RELEASE $ARCH is not running"
+ rc=3
+ done
+ fi
if [ -z "$server_list" ]; then
- echo "No managed stap-server is running"
- return 3
+ server_list=`managed_servers`
+ if [ -z "$server_list" ]; then
+ echo "No managed stap-server is running"
+ return 3
+ fi
fi
# Get status of each server in turn
- local server_status
- for server_status in $server_list; do
- local release_arch=`echo $server_status | sed 's/_/ /'`
- local server_status_file=`stat_file $server_status`
- if [ ! -f $server_status_file ]; then
- echo "stap-server for $release_arch is not running"
- rc=3
- else
- local pid=`cat $server_status_file`
- if check_server_running $server_status; then
- echo "stap-server for $release_arch running as PID $pid"
- else
- echo "stap-server for $release_arch started as PID $pid is no longer running"
- rm -f $server_status_file
- rc=1
- fi
+ local pid
+ for pid in $server_list; do
+ . $STAT_PATH/$pid
+ if ! server_still_running $pid; then
+ echo "stap-server for $RELEASE $ARCH started as PID $pid is no longer running"
+ rc=1
+ continue
fi
+ echo "stap-server for $RELEASE $ARCH running as PID $pid"
done
return $rc
}
# Restart or start if not running
-function restart () { # server-list
- local server_list
-
+function restart () { # server-cmds
# Restart the specified servers or all servers, if none specified.
- server_list="$1"
- [ -z "$server_list" ] && server_list=`managed_servers`
+ local server_cmds="$1"
+ if [ -z "$server_cmds" ]; then
+ local server_list=`managed_servers`
+ local pid
+ for pid in $server_list; do
+ . $STAT_PATH/$pid
+ server_cmds="$server_cmds ARCH='$ARCH' RELEASE='$RELEASE'"
+ done
+ fi
# Stop the specified servers, or all if none specified
- stop "$server_list"
+ stop "$server_cmds"
local rc=$?
echo
# Restart the same servers. If none were specified then
# start the configured or default server(s)).
- start "$server_list"
+ start "$server_cmds"
local this_rc=$?
[ $this_rc != 0 ] && rc=$this_rc
@@ -431,52 +480,62 @@ function restart () { # server-list
# Restart only if running
function condrestart () { # server-list
- local server_list
-
# Restart the specified servers or all servers, if none specified,
# but only if they are already running.
- server_list="$1"
- [ -z "$server_list" ] && server_list=`managed_servers`
-
- # No server specified or running?
- if [ -z "$server_list" ]; then
- clog "No managed stap-server is running" -n
- do_success "No managed stap-server is running"
- return 0
+ local server_cmds="$1"
+ if [ -z "$server_cmds" ]; then
+ local server_list=`managed_servers`
+ local pid
+ for pid in $server_list; do
+ . $STAT_PATH/$pid
+ server_cmds="$server_cmds ARCH='$ARCH' RELEASE='$RELEASE'"
+ done
+ # No server specified or running?
+ if [ -z "$server_cmds" ]; then
+ clog "No managed stap-server is running" -n
+ do_success "No managed stap-server is running"
+ return 0
+ fi
fi
# For each server in the list, stop it if it is running
- local rc=0
- local this_rc
- local start_list=
- local server_spec
+ local start_cmds=
local first=1
- for server_spec in $server_list; do
- test $first = 0 && echo
- first=0
-
- if ! status $server_spec >/dev/null 2>&1; then
- local release=`get_release $server_spec`
- local arch=`get_arch $server_spec`
- clog $"$prog for $release $arch is not running" -n
- do_success "$prog for $release $arch is not running"
+ local server_cmd=
+ local cmd
+ for cmd in $server_cmds; do
+ # Collect commands until the RELEASE= command is found.
+ server_cmd="$server_cmd $cmd"
+ eval $cmd
+ echo $cmd | grep -q ^RELEASE || continue
+
+ test $first = 0 && echo
+ first=0
+
+ # Now see if this server is running
+ if ! status "$server_cmd" >/dev/null 2>&1; then
+ clog $"$prog for $RELEASE $ARCH is not running" -n
+ do_success "$prog for $RELEASE $ARCH is not running"
+ server_cmd=
continue
- fi
+ fi
- start_list="$start_list $server_spec"
+ start_cmds="$start_cmds $server_cmd"
- stop "$server_spec"
- this_rc=$?
- [ $this_rc != 0 ] && rc=$this_rc
+ stop "$server_cmd"
+ this_rc=$?
+ [ $this_rc != 0 ] && rc=$this_rc
+
+ server_cmd=
done
# Now restart the servers that were running
- for server_spec in $start_list; do
- echo
- start "$server_spec"
- local this_rc=$?
- [ $this_rc != 0 ] && rc=$this_rc
- done
+ if [ "X$start_cmds" != "X" ]; then
+ echo
+ start "$start_cmds"
+ local this_rc=$?
+ [ $this_rc != 0 ] && rc=$this_rc
+ fi
return $rc
}
@@ -494,6 +553,8 @@ if [ $? -ne 0 ]; then
exit 2
fi
+# Initialize server specs
+OPT_SERVER_CMDS=
parse_args $OPTS || exit 2
load_config
@@ -502,27 +563,27 @@ RETVAL=0
case $CMD in
start)
# Start specified servers. If none specified, start configured servers
- start "$OPT_SERVER_LIST"
+ start "$OPT_SERVER_CMDS"
RETVAL=$?
;;
stop)
# Stop specified servers
- stop "$OPT_SERVER_LIST"
+ stop "$OPT_SERVER_CMDS"
RETVAL=$?
;;
# Restart specified servers
restart)
- restart "$OPT_SERVER_LIST"
+ restart "$OPT_SERVER_CMDS"
RETVAL=$?
;;
# Restart specified servers if they are running
condrestart|try-restart)
- condrestart "$OPT_SERVER_LIST"
+ condrestart "$OPT_SERVER_CMDS"
RETVAL=$?
;;
# Give status on specified servers
status)
- status "$OPT_SERVER_LIST"
+ status "$OPT_SERVER_CMDS"
exit $?
;;
# Reloading config without stop/restart is not supported
@@ -536,7 +597,7 @@ case $CMD in
echo
# Restart specified servers
# If none specified, restart configured servers
- start "$OPT_SERVER_LIST"
+ start "$OPT_SERVER_CMDS"
RETVAL=$?
;;
usage|*)