run_process will use screen if USE_SCREEN=True (the default), otherwise it will simply start the requested service. Therefore wherever screen_it used, run_process can be instead. Where stop_screen was found it has been replaced with stop_process. A tail_log function has been added which will tail a logfile in a screen if USE_SCREEN is True. lib/template has been updated to reflect the use of the new functions. When using sg the quoting in run_process gets very complicated. To get around this run_process and the functions it calls accepts an optional third argument. If set it is a group to be used with sg. Change-Id: Ia3843818014f7c6c7526ef3aa9676bbddb8a85ca
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
# tests/exec.sh - Test DevStack run_process() and stop_process()
 | 
						|
#
 | 
						|
# exec.sh start|stop|status
 | 
						|
#
 | 
						|
# Set USE_SCREEN True|False to change use of screen.
 | 
						|
#
 | 
						|
# This script emulates the basic exec envirnment in ``stack.sh`` to test
 | 
						|
# the process spawn and kill operations.
 | 
						|
 | 
						|
if [[ -z $1 ]]; then
 | 
						|
    echo "$0 start|stop"
 | 
						|
    exit 1
 | 
						|
fi
 | 
						|
 | 
						|
TOP_DIR=$(cd $(dirname "$0")/.. && pwd)
 | 
						|
source $TOP_DIR/functions
 | 
						|
 | 
						|
USE_SCREEN=${USE_SCREEN:-False}
 | 
						|
 | 
						|
ENABLED_SERVICES=fake-service
 | 
						|
 | 
						|
SERVICE_DIR=/tmp
 | 
						|
SCREEN_NAME=test
 | 
						|
SCREEN_LOGDIR=${SERVICE_DIR}/${SCREEN_NAME}
 | 
						|
 | 
						|
 | 
						|
# Kill background processes on exit
 | 
						|
trap clean EXIT
 | 
						|
clean() {
 | 
						|
    local r=$?
 | 
						|
    jobs -p
 | 
						|
    kill >/dev/null 2>&1 $(jobs -p)
 | 
						|
    exit $r
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
# Exit on any errors so that errors don't compound
 | 
						|
trap failed ERR
 | 
						|
failed() {
 | 
						|
    local r=$?
 | 
						|
    jobs -p
 | 
						|
    kill >/dev/null 2>&1 $(jobs -p)
 | 
						|
    set +o xtrace
 | 
						|
    [ -n "$LOGFILE" ] && echo "${0##*/} failed: full log in $LOGFILE"
 | 
						|
    exit $r
 | 
						|
}
 | 
						|
 | 
						|
function status {
 | 
						|
    if [[ -r $SERVICE_DIR/$SCREEN_NAME/fake-service.pid ]]; then
 | 
						|
        pstree -pg $(cat $SERVICE_DIR/$SCREEN_NAME/fake-service.pid)
 | 
						|
    fi
 | 
						|
    ps -ef | grep fake
 | 
						|
}
 | 
						|
 | 
						|
function setup_screen {
 | 
						|
if [[ ! -d $SERVICE_DIR/$SCREEN_NAME ]]; then
 | 
						|
    rm -rf $SERVICE_DIR/$SCREEN_NAME
 | 
						|
    mkdir -p $SERVICE_DIR/$SCREEN_NAME
 | 
						|
fi
 | 
						|
 | 
						|
if [[ "$USE_SCREEN" == "True" ]]; then
 | 
						|
    # Create a new named screen to run processes in
 | 
						|
    screen -d -m -S $SCREEN_NAME -t shell -s /bin/bash
 | 
						|
    sleep 1
 | 
						|
 | 
						|
    # Set a reasonable status bar
 | 
						|
    if [ -z "$SCREEN_HARDSTATUS" ]; then
 | 
						|
        SCREEN_HARDSTATUS='%{= .} %-Lw%{= .}%> %n%f %t*%{= .}%+Lw%< %-=%{g}(%{d}%H/%l%{g})'
 | 
						|
    fi
 | 
						|
    screen -r $SCREEN_NAME -X hardstatus alwayslastline "$SCREEN_HARDSTATUS"
 | 
						|
fi
 | 
						|
 | 
						|
# Clear screen rc file
 | 
						|
SCREENRC=$TOP_DIR/tests/$SCREEN_NAME-screenrc
 | 
						|
if [[ -e $SCREENRC ]]; then
 | 
						|
    echo -n > $SCREENRC
 | 
						|
fi
 | 
						|
}
 | 
						|
 | 
						|
# Mimic logging
 | 
						|
    # Set up output redirection without log files
 | 
						|
    # Copy stdout to fd 3
 | 
						|
    exec 3>&1
 | 
						|
    if [[ "$VERBOSE" != "True" ]]; then
 | 
						|
        # Throw away stdout and stderr
 | 
						|
        #exec 1>/dev/null 2>&1
 | 
						|
        :
 | 
						|
    fi
 | 
						|
    # Always send summary fd to original stdout
 | 
						|
    exec 6>&3
 | 
						|
 | 
						|
 | 
						|
if [[ "$1" == "start" ]]; then
 | 
						|
    echo "Start service"
 | 
						|
    setup_screen
 | 
						|
    run_process fake-service "$TOP_DIR/tests/fake-service.sh"
 | 
						|
    sleep 1
 | 
						|
    status
 | 
						|
elif [[ "$1" == "stop" ]]; then
 | 
						|
    echo "Stop service"
 | 
						|
    stop_process fake-service
 | 
						|
    status
 | 
						|
elif [[ "$1" == "status" ]]; then
 | 
						|
    status
 | 
						|
else
 | 
						|
    echo "Unknown command"
 | 
						|
    exit 1
 | 
						|
fi
 |