0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00
mongodb/evergreen/kill_processes.sh

55 lines
2.2 KiB
Bash
Executable File

process_kill_list="(^cl\.exe$|java|lein|lldb|mongo|python|_test$|_test\.exe$)"
# Exclude Evergreen agent processes and other system daemons
process_exclude_list="(main|tuned|evergreen)"
if [ "Windows_NT" = "$OS" ]; then
# Get the list of Windows tasks (tasklist list format):
# - Transpose the Image Name and PID
# - The first column has the process ID
# - The second column (and beyond) has task name
# - Grep for the task names of interest while ignoring any names that are in the exclude list
processes=$(tasklist /fo:csv | awk -F'","' '{x=$1; gsub("\"","",x); print $2, x}' | grep -iE "$process_kill_list" | grep -ivE "$process_exclude_list")
# Kill the Windows process by process ID with force (/f)
kill_process() {
pid=$(echo $1 | cut -f1 -d ' ')
echo "Killing process $1"
taskkill /pid "$pid" /f
}
else
# Get the list of Unix tasks (pgrep full & long):
# - Grep for the task names of interest while ignoring any names that are in the exclude list
# - The first column has the process ID
# - The second column (and beyond) has task name
# There are 2 "styles" of pgrep, figure out which one works.
# Due to https://bugs.launchpad.net/ubuntu/+source/procps/+bug/1501916
# we cannot rely on the return status ($?) to detect if the option is supported.
pgrep -f --list-full ".*" 2>&1 | grep -qE "(illegal|invalid|unrecognized) option"
if [ $? -ne 0 ]; then
pgrep_list=$(pgrep -f --list-full "$process_kill_list")
else
pgrep_list=$(pgrep -f -l "$process_kill_list")
fi
# Since a process name might have a CR or LF in it, we need to delete any lines from
# pgrep which do not start with space(s) and 1 digit and trim any leading spaces.
processes=$(echo "$pgrep_list" | grep -ivE "$process_exclude_list" | sed -e '/^ *[0-9]/!d; s/^ *//; s/[[:cntrl:]]//g;')
# Kill the Unix process ID with signal KILL (9)
kill_process() {
pid=$(echo $1 | cut -f1 -d ' ')
echo "Killing process $1"
kill -9 $pid
}
fi
# Since a full process name can have spaces, the IFS (internal field separator)
# should not include a space, just a LF & CR
IFS=$(printf "\n\r")
for process in $processes; do
kill_process "$process"
done
exit 0