diff options
author | Dave Brolley <brolley@redhat.com> | 2009-12-08 11:51:45 -0500 |
---|---|---|
committer | Dave Brolley <brolley@redhat.com> | 2009-12-08 11:51:45 -0500 |
commit | fd0a75c3bc3ce806eb89eea1f346ba62ca1999d4 (patch) | |
tree | 6e546bf5d9d6e8be14a38d7003c96f6e27e70735 | |
parent | 6bb613f9be856632dec47cab4b27a7fe92c2fe64 (diff) | |
download | systemtap-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.in | 359 |
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|*) |