diff --git a/tools/killall5 b/tools/killall5 new file mode 100755 index 0000000..149e736 --- /dev/null +++ b/tools/killall5 @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +# A simple reimplementation of killall5 from sysvinit-tools + +get_my_tree() { + local my_pid + read my_pid garbage < "/proc/self/stat" + child="$my_pid" + + while [[ "$parent" != 1 ]]; do + read a b c parent d < "/proc/$child/stat"; + child="$parent" + echo "$parent" + done +} + +get_realname() { + readlink -e "$1" +} + +get_all_procs() { + local processlist + + for i in /proc/*/exe; do + process_dir="${i%/*}" + process_pid="${process_dir##*/}" + + readlink -e "$i" &>/dev/null && { + echo "$process_pid" + } + done +} + +get_procs_to_kill() { + for i in "${all_procs[@]}"; do + unset skip + for p in "${my_tree[@]}"; do + [[ "$i" == "$p" ]] && { skip=1; } + done + + [[ "$skip" ]] || { echo "$i"; } + done +} + +main() { + my_tree=( $(get_my_tree) self thread-self ) + all_procs=( $(get_all_procs) ) + procs_to_kill=( $(get_procs_to_kill) ) + + signal="${1:-"-15"}" + + kill "$signal" "${procs_to_kill[@]}" 2>/dev/null + + return 0 +} + +main "$@"