From: Harald Hoyer Date: Tue, 15 May 2018 11:37:53 +0000 (+0200) Subject: shutdown: sleep a little, if a process was killed X-Git-Tag: 048~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=df6bb5e959178cba06118493a7c8d019e84d54e7;p=thirdparty%2Fdracut.git shutdown: sleep a little, if a process was killed If a process (maybe plymouth) was still pinning /oldroot, then shutdown would - kill -9 $pid - umount_a - umount_a in a very short timeframe. A small sleep hopefully lets the scheduler free up /oldroot in the mean time. --- diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh index 99cb9dbc6..b78272a31 100755 --- a/modules.d/99base/dracut-lib.sh +++ b/modules.d/99base/dracut-lib.sh @@ -118,6 +118,7 @@ str_replace() { killall_proc_mountpoint() { local _pid local _t + local _killed=0 for _pid in /proc/*; do _pid=${_pid##/proc/} case $_pid in @@ -125,8 +126,12 @@ killall_proc_mountpoint() { esac [ -e "/proc/$_pid/exe" ] || continue [ -e "/proc/$_pid/root" ] || continue - strstr "$(ls -l -- "/proc/$_pid" "/proc/$_pid/fd" 2>/dev/null)" "$1" && kill -9 "$_pid" + if strstr "$(ls -l -- "/proc/$_pid" "/proc/$_pid/fd" 2>/dev/null)" "$1" ; then + kill -9 "$_pid" + _killed=1 + fi done + return $_killed } getcmdline() { diff --git a/modules.d/99shutdown/module-setup.sh b/modules.d/99shutdown/module-setup.sh index 5cb3594a8..dfd6caa20 100755 --- a/modules.d/99shutdown/module-setup.sh +++ b/modules.d/99shutdown/module-setup.sh @@ -14,7 +14,7 @@ depends() { # called by dracut install() { local _d - inst_multiple umount poweroff reboot halt losetup stat + inst_multiple umount poweroff reboot halt losetup stat sleep inst_multiple -o kexec inst "$moddir/shutdown.sh" "$prefix/shutdown" [ -e "${initdir}/lib" ] || mkdir -m 0755 -p ${initdir}/lib diff --git a/modules.d/99shutdown/shutdown.sh b/modules.d/99shutdown/shutdown.sh index 918a8a4f1..f21cc811b 100755 --- a/modules.d/99shutdown/shutdown.sh +++ b/modules.d/99shutdown/shutdown.sh @@ -38,7 +38,7 @@ source_hook pre-shutdown warn "Killing all remaining processes" -killall_proc_mountpoint /oldroot +killall_proc_mountpoint /oldroot || sleep 0.2 umount_a() { local _did_umount="n"