| #!/usr/bin/env bash |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| |
| # qpid.stop Script |
| # |
| # Script checks for a given pid running DEFAULT_SEARCH and attempts to quit it |
| # |
| |
| MAX_ATTEMPTS=2 |
| SLEEP_DELAY=1 |
| DEFAULT_SEARCH="PNAME=QPBRKR" |
| |
| if [ -z "$QPID_STOP_SEARCH" ]; then |
| SEARCH=$DEFAULT_SEARCH; |
| else |
| SEARCH=$QPID_STOP_SEARCH; |
| fi |
| |
| # |
| # Forcably Quit the specified PID($1) |
| # |
| forceQuit() |
| { |
| kill -9 $1 |
| } |
| |
| # |
| # Gracefully ask the PID($1) to quit |
| # |
| quit() |
| { |
| kill $1 |
| } |
| |
| # |
| # grep for the session ID ($1) and return 0 for successful quit and 1 for process alive |
| # |
| lookup_pid() |
| { |
| result=`ps -e | grep $1 | wc -l` |
| } |
| |
| # |
| # grep ps for all instances of $SEARCH for the current user and collect PIDs |
| # |
| lookup_all_pids() |
| { |
| pids=`pgrep -f -U $USER $SEARCH` |
| result_all=`echo -n $pids | wc -w` |
| } |
| |
| # |
| # check that the PID passed in is for a Qpid broker owned by this user and alive |
| # |
| validate_pid() |
| { |
| result=`pgrep -fl $SEARCH | grep $1 | wc -l` |
| } |
| |
| # |
| # Show the PS output for given set of pids |
| # |
| showPids() |
| { |
| ps -o user,pid,args -p $pids |
| } |
| |
| # |
| # Sleep and then check then lookup the PID($1) to ensure it has quit |
| # |
| check() |
| { |
| echo "Waiting $SLEEP_DELAY second for $1 to exit" |
| sleep $SLEEP_DELAY |
| lookup_pid $1 |
| } |
| |
| # |
| # Verify the PID($1) is available |
| # |
| verifyPid() |
| { |
| validate_pid $1 |
| if [[ $[$result] == 1 ]] ; then |
| brokerspid=$1 |
| else |
| echo "Unable to locate Qpid Broker Process with PID $1. Check PID and try again." |
| exit -1 |
| fi |
| } |
| |
| # |
| # Stops all Qpid brokers for current user |
| # |
| qpid_stopall_brokers() |
| { |
| for pid in $pids ; do |
| lookup_pid $pid; |
| brokerspid=$pid; |
| stop_broker $pid; |
| done |
| } |
| |
| # |
| # Stops Qpid broker with brokerspid id |
| # |
| stop_broker() |
| { |
| # Attempt to quit the process MAX_ATTEMPTS Times |
| attempt=0 |
| while [[ $[$result] > 0 && $[$attempt] < $[$MAX_ATTEMPTS] ]] ; do |
| quit $brokerspid |
| check $brokerspid |
| attempt=$[$attempt + 1] |
| done |
| |
| # Check that it has quit |
| if [[ $[$result] == 0 ]] ; then |
| echo "Process quit" |
| else |
| |
| attempt=0 |
| # Now attempt to force quit the process |
| while [[ $[$result] > 0 && $[$attempt] < $[$MAX_ATTEMPTS] ]] ; do |
| forceQuit $brokerspid |
| check $brokerspid |
| attempt=$[$attempt + 1] |
| done |
| |
| # Output final status |
| if [[ $[$result] > 0 && $[$attempt] == $[$MAX_ATTEMPTS] ]] ; then |
| echo "Stopped trying to kill process: $brokerspid" |
| echo "Attempted to stop $attempt times" |
| else |
| echo "Done " |
| fi |
| fi |
| |
| } |
| |
| # |
| # Main Run |
| # |
| |
| # Check if we are killing all qpid pids or just one. |
| # Now uses local function qpid_stopall_brokers |
| if [[ $# == 0 ]] ; then |
| lookup_all_pids |
| if [[ $[$result_all] > 0 ]] ; then |
| echo "Killing All Qpid Brokers for user: '$USER'" |
| qpid_stopall_brokers |
| else |
| echo "No Qpid Brokers found running for user: " $USER |
| fi |
| exit $result |
| else |
| verifyPid $1 |
| stop_broker |
| exit $result |
| fi |
| |