diff --git a/README.md b/README.md index 247ebde..68ecd32 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,4 @@ A simple rc script to kickstart your system. ## depends * Enabled sysrq or halt from suckless.org's ubase. +* /proc support. diff --git a/rc.conf b/rc.conf index f0c9dd0..80e5ec7 100644 --- a/rc.conf +++ b/rc.conf @@ -40,3 +40,6 @@ cfg_mounts=( # Some temporary directories and files cfg_tmpdirs+=( '/run/lock' '/run/lock/lvm' '/run/lvm' '/run/user' ) cfg_tmpfiles+=( '/run/utmp' ) + +# How long do we wait for all processes to die nicely? +cfg_killall5_timeout=30 diff --git a/rc.in b/rc.in index afbc0cf..af4d83d 100644 --- a/rc.in +++ b/rc.in @@ -101,10 +101,10 @@ rc.services_stop() { rc.stop_everything() { echo "Politely asking all processes to shut down..." - killall5 -15; sleep 3 + killall5 -s 15 -w "$cfg_killall5_timeout" echo "Killing the remaning ones..." - killall5 -9 + killall5 -s 9 } rc.unmount_everything() { diff --git a/tools/killall5.in b/tools/killall5.in index e3fa5a3..e13f9fe 100644 --- a/tools/killall5.in +++ b/tools/killall5.in @@ -37,14 +37,60 @@ get_procs_to_kill() { done } +pids_exist() { + for i in "$@"; do + if [[ -d "/proc/$i" ]]; then + return 0 + fi + done + + return 1 +} + +pid_wait() { + declare counter + + while pids_exist "$@"; do + if (( counter == timeout )); then + return 1 + fi + + sleep 1 + + (( counter++ )) + done +} + main() { + timeout=30 + signal=15 + + while (( $# )); do + case $1 in + -w) + flag_wait=1 + timeout=$2 + shift + ;; + + -s) + signal=$2 + shift + ;; + esac + + shift + done + my_tree=( $(get_my_tree) self thread-self ) all_procs=( $(get_all_procs) ) procs_to_kill=( $(get_procs_to_kill) ) - signal="${1:-"-15"}" + kill -n "$signal" "${procs_to_kill[@]}" 2>/dev/null - kill "$signal" "${procs_to_kill[@]}" 2>/dev/null + if (( flag_wait )); then + pid_wait "${procs_to_kill[@]}" + fi return 0 }