aboutsummaryrefslogtreecommitdiffstats
path: root/package/base-files/files/lib/upgrade
diff options
context:
space:
mode:
Diffstat (limited to 'package/base-files/files/lib/upgrade')
-rw-r--r--package/base-files/files/lib/upgrade/common.sh39
1 files changed, 27 insertions, 12 deletions
diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh
index 6f1880fba6..ba9de99dc9 100644
--- a/package/base-files/files/lib/upgrade/common.sh
+++ b/package/base-files/files/lib/upgrade/common.sh
@@ -99,6 +99,13 @@ kill_remaining() { # [ <signal> ]
local sig="${1:-TERM}"
echo -n "Sending $sig to remaining processes ... "
+ local my_pid=$$
+ local my_ppid=$(cut -d' ' -f4 /proc/$my_pid/stat)
+ local my_ppisupgraded=
+ grep -q upgraded /proc/$my_ppid/cmdline >/dev/null && {
+ local my_ppisupgraded=1
+ }
+
local stat
for stat in /proc/[0-9]*/stat; do
[ -f "$stat" ] || continue
@@ -113,18 +120,26 @@ kill_remaining() { # [ <signal> ]
# Skip kernel threads
[ -n "$cmdline" ] || continue
- case "$name" in
- # Skip essential services
- *procd*|*upgraded*|*ash*|*init*|*watchdog*|*ssh*|*dropbear*|*telnet*|*login*|*hostapd*|*wpa_supplicant*|*nas*) : ;;
-
- # Killable process
- *)
- if [ $pid -ne $$ ] && [ $ppid -ne $$ ]; then
- echo -n "$name "
- kill -$sig $pid 2>/dev/null
- fi
- ;;
- esac
+ if [ $$ -eq 1 ] || [ $my_ppid -eq 1 ] && [ -n "$my_ppisupgraded" ]; then
+ # Running as init process, kill everything except me
+ if [ $pid -ne $$ ] && [ $pid -ne $my_ppid ]; then
+ echo -n "$name "
+ kill -$sig $pid 2>/dev/null
+ fi
+ else
+ case "$name" in
+ # Skip essential services
+ *procd*|*ash*|*init*|*watchdog*|*ssh*|*dropbear*|*telnet*|*login*|*hostapd*|*wpa_supplicant*|*nas*) : ;;
+
+ # Killable process
+ *)
+ if [ $pid -ne $$ ] && [ $ppid -ne $$ ]; then
+ echo -n "$name "
+ kill -$sig $pid 2>/dev/null
+ fi
+ ;;
+ esac
+ fi
done
echo ""
}