Add script 'check_systemd_service.sh'.
This commit is contained in:
		
							
								
								
									
										277
									
								
								check_systemd_service.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										277
									
								
								check_systemd_service.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,277 @@ | ||||
| #!/usr/bin/env bash | ||||
|  | ||||
| LOCK_DIR="/tmp/$(basename $0).$$.LOCK" | ||||
| log_file="${LOCK_DIR}/${script_name%%.*}.log" | ||||
|  | ||||
| #--------------------------------------- | ||||
| #----------------------------- | ||||
| # Base Function(s) | ||||
| #----------------------------- | ||||
| #--------------------------------------- | ||||
|  | ||||
| usage() { | ||||
|  | ||||
|  | ||||
|    [[ -n  "$1" ]] && error "$1" | ||||
|  | ||||
|  | ||||
|    [[ $terminal ]] && echo -e " | ||||
| \033[1mUsage:\033[m | ||||
|  | ||||
|    $(basename $0) <Systemd-Service> | ||||
|  | ||||
| \033[1mDescription\033[m | ||||
|  | ||||
|    Script checks if given service is running and tries to restart service | ||||
|    if it is not running. | ||||
|  | ||||
| \033[1mOptions\033[m | ||||
|  | ||||
|    No Options available | ||||
|  | ||||
| \033[1mExample:\033[m | ||||
|     | ||||
|    Check if apache2 service is runnin. Restart service if needed. | ||||
|  | ||||
|       $(basename $0) apache2 | ||||
|  | ||||
| " | ||||
|  | ||||
|    clean_up 1 | ||||
| } | ||||
|  | ||||
|  | ||||
| clean_up() { | ||||
|  | ||||
|    # Perform program exit housekeeping | ||||
|    rm -rf "$LOCK_DIR" | ||||
|    blank_line | ||||
|    exit $1 | ||||
| } | ||||
|  | ||||
|  | ||||
| fatal(){ | ||||
|    echo "" | ||||
|    if $terminal ; then | ||||
|       echo -e "   [ \033[31m\033[1mFatal\033[m ] $*" | ||||
|    else | ||||
|       echo -e "   [ Fatal ] $*" | ||||
|    fi | ||||
|    echo "" | ||||
|    if $terminal ; then | ||||
|       echo -e "             \033[1mScript terminated\033[m.." | ||||
|    else | ||||
|       echo -e "             Script terminated.." | ||||
|    fi | ||||
| 	clean_up 1 | ||||
| } | ||||
|  | ||||
| error (){ | ||||
|    echo "" | ||||
|    if $terminal ; then | ||||
|       echo -e "   [ \033[31m\033[1mError\033[m ] $*" | ||||
|    else | ||||
|       echo "   [ Error ] $*" | ||||
|    fi | ||||
|    echo "" | ||||
| } | ||||
|  | ||||
| warn (){ | ||||
|    if $LOGGING || $terminal ; then | ||||
|       echo "" | ||||
|       if $terminal ; then | ||||
|          echo -e "   [ \033[33m\033[1mWarn\033[m ]  $*" | ||||
|       else | ||||
|          echo "   [ Warn ]  $*" | ||||
|       fi | ||||
|       echo "" | ||||
|    fi | ||||
| } | ||||
|  | ||||
| info (){ | ||||
|    if $LOGGING || $terminal ; then | ||||
|       echo "" | ||||
|       if $terminal ; then | ||||
|          echo -e "   [ \033[32m\033[1mInfo\033[m ]  $*" | ||||
|       else | ||||
|          echo "   [ Info ]  $*" | ||||
|       fi | ||||
|       echo "" | ||||
|    fi | ||||
| } | ||||
|  | ||||
| ok (){ | ||||
|    if $LOGGING || $terminal ; then | ||||
|       echo "" | ||||
|       if $terminal ; then | ||||
|          echo -e "   [ \033[32m\033[1mOk\033[m ]    $*" | ||||
|       else | ||||
|          echo "   [ Ok ]    $*" | ||||
|       fi | ||||
|       echo "" | ||||
|    fi | ||||
| } | ||||
|  | ||||
| blank_line() { | ||||
|    if $terminal ; then | ||||
|       echo "" | ||||
|    fi | ||||
| } | ||||
|  | ||||
| trim() { | ||||
|     local var="$*" | ||||
|     var="${var#"${var%%[![:space:]]*}"}"   # remove leading whitespace characters | ||||
|     var="${var%"${var##*[![:space:]]}"}"   # remove trailing whitespace characters | ||||
|     echo -n "$var" | ||||
| } | ||||
|  | ||||
|  | ||||
| # ---------- | ||||
| # - Jobhandling  | ||||
| # ---------- | ||||
|  | ||||
| # - Run 'clean_up' for signals SIGHUP SIGINT SIGTERM | ||||
| # - | ||||
| trap clean_up SIGHUP SIGINT SIGTERM | ||||
|  | ||||
| # - Create lock directory '$LOCK_DIR" | ||||
| # | ||||
| mkdir "$LOCK_DIR" | ||||
|  | ||||
|  | ||||
|  | ||||
| #--------------------------------------- | ||||
| #----------------------------- | ||||
| # Check some prerequisites | ||||
| #----------------------------- | ||||
| #--------------------------------------- | ||||
|  | ||||
| # - Running in a terminal? | ||||
| # - | ||||
| if [[ -t 1 ]] ; then | ||||
|    terminal=true | ||||
|    LOGGING=true | ||||
| else | ||||
|    terminal=false | ||||
|    LOGGING=false | ||||
| fi | ||||
|  | ||||
| if [[ -n "$1" ]] ; then | ||||
|    service_name=$1 | ||||
| else | ||||
| 	error "No Service given!" | ||||
| 	usage | ||||
| fi | ||||
|  | ||||
|  | ||||
| # - Systemd supported ? | ||||
| # - | ||||
| systemd=$(which systemd) | ||||
| systemctl=$(which systemctl) | ||||
|  | ||||
| systemd_supported=false | ||||
| if [[ -n "$systemd" ]] && [[ -n "$systemctl" ]] ; then | ||||
|    systemd_supported=true | ||||
| else | ||||
|    fatal "Systemd is not present!" | ||||
| fi | ||||
|  | ||||
| if systemctl -t service list-unit-files \ | ||||
|       | grep -e "^${service_name,,}d" \ | ||||
|       | grep -q -E "(enabled|disabled)" 2> /devnull ; then | ||||
|  | ||||
|    SYSTEMD_SERVICE="$(systemctl -t service list-unit-files | grep -e "^${service_name,,}d" | awk '{print$1}' | head -1)" | ||||
| elif systemctl -t service list-unit-files \ | ||||
|       | grep -e "^${service_name,,}" \ | ||||
|       | grep -q -E "(enabled|disabled)" 2> /devnull ; then | ||||
|  | ||||
|    SYSTEMD_SERVICE="$(systemctl -t service list-unit-files | grep -e "^${service_name,,}" | awk '{print$1}' | head -1)" | ||||
| fi | ||||
|  | ||||
| if [[ -z "$SYSTEMD_SERVICE" ]]; then | ||||
|    fatal "Systemd Service '${service_name}' not found!" | ||||
| fi | ||||
|  | ||||
|  | ||||
| #--------------------------------------- | ||||
| #----------------------------- | ||||
| # Check if service is running | ||||
| #----------------------------- | ||||
| #--------------------------------------- | ||||
|  | ||||
| if $LOGGING ; then | ||||
| 	declare -i _length="${#service_name}" | ||||
|    echo -e "\n   Check if $service_name service is running.." | ||||
|    echo -en "   ===============================" | ||||
| 	declare -i i=0 | ||||
| 	while [[ $i -lt $_length ]] ; do | ||||
| 		echo -n "=" | ||||
| 		((i++)) | ||||
| 	done | ||||
| 	echo "" | ||||
| fi | ||||
|  | ||||
| need_restart=false | ||||
| if $(systemctl is-active $SYSTEMD_SERVICE > /dev/null 2>&1) ; then | ||||
|    eval $(systemctl show -p MainPID ${SYSTEMD_SERVICE}) | ||||
|    if [[ -n "$MainPID" ]] && [[ $MainPID -gt 0 ]]; then | ||||
|       if $(ps ax | grep -q -E "^\s*${MainPID} " 2> /dev/null) ; then | ||||
|          ok "$service_name service is up and running." | ||||
|       else | ||||
|          error "$service_name service seems to be down! Trying to restart service now.." | ||||
|          need_restart=true | ||||
|       fi | ||||
|    else | ||||
|       ok "$service_name service is up and running." | ||||
| 		warn "Cannot determine MainPID for Service '$service_name', but the status is 'active'." | ||||
|    fi | ||||
|     | ||||
| else | ||||
|    error "$service_name service seems to be down! Trying to restart service now.." | ||||
|    need_restart=true | ||||
| fi | ||||
|  | ||||
| if $need_restart ; then | ||||
|  | ||||
|    $systemctl daemon-reload > /dev/null 2> $log_file | ||||
|    if [[ $? -ne 0 ]]; then | ||||
|       error "$(cat $log_file)" | ||||
|    fi | ||||
|    sleep 2 | ||||
|    $systemctl stop $SYSTEMD_SERVICE > /dev/null 2> $log_file | ||||
|    if [[ $? -ne 0 ]]; then | ||||
|       error "$(cat $log_file)" | ||||
|    fi | ||||
|    sleep 10 | ||||
|    $systemctl start $SYSTEMD_SERVICE > /dev/null 2> $log_file | ||||
|    if [[ $? -ne 0 ]]; then | ||||
|       error "$(cat $log_file)" | ||||
|    fi | ||||
|  | ||||
|    sleep 5 | ||||
|    if $(systemctl is-active $SYSTEMD_SERVICE > /dev/null 2>&1) ; then | ||||
|       eval $(systemctl show -p MainPID ${SYSTEMD_SERVICE}) | ||||
|       if [[ -n "$MainPID" ]] && [[ $MainPID -gt 0 ]]; then | ||||
|          if $(ps ax | grep -q -E "^\s*${MainPID} " 2> /dev/null) ; then | ||||
|             ok "$service_name service is now up and running. New PID is '$MainPID'" | ||||
|             if ! $terminal ; then | ||||
|                echo "   [ Ok ]    service is now up and running. New PID is '$MainPID'" | ||||
|             fi | ||||
|          else | ||||
|             error "Restarting $service_name service failed!" | ||||
|          fi | ||||
|       else | ||||
|          warn "Cannot determine MainPID for Service '$service_name', but the status is 'active'." | ||||
|          ok "$service_name service is up and running." | ||||
|          if ! $terminal ; then | ||||
|             echo "   [ Ok ]    service is now up and running. New PID is '$MainPID'" | ||||
|             echo "   [ Warn ]  Cannot determine MainPID for Service '$service_name', but the status is 'active'." | ||||
|          fi | ||||
|       fi | ||||
|    else | ||||
|       error "Restarting $service_name service failed!" | ||||
|    fi | ||||
|        | ||||
| fi | ||||
|  | ||||
| clean_up 0 | ||||
		Reference in New Issue
	
	Block a user