mirror of
https://github.com/mongodb/mongo.git
synced 2024-11-29 16:47:28 +01:00
55 lines
2.2 KiB
Bash
Executable File
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
|