From df6bb5e959178cba06118493a7c8d019e84d54e7 Mon Sep 17 00:00:00 2001 From: Harald Hoyer Date: Tue, 15 May 2018 13:37:53 +0200 Subject: [PATCH] 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. --- modules.d/99base/dracut-lib.sh | 7 ++++++- modules.d/99shutdown/module-setup.sh | 2 +- modules.d/99shutdown/shutdown.sh | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh index 99cb9dbc..b78272a3 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 5cb3594a..dfd6caa2 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 918a8a4f..f21cc811 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"