From 6d80ce78f1a7961dbe7ad63cbc79e36cdae4edf7 Mon Sep 17 00:00:00 2001
From: Jo-Philipp Wich <jow@openwrt.org>
Date: Wed, 16 Nov 2011 15:01:18 +0000
Subject: [PATCH] base-files: rewrite killing of nonessential services to not
 rely on top, use the proc filesystem only

SVN-Revision: 29187
---
 package/base-files/Makefile                   |  2 +-
 .../base-files/files/lib/upgrade/common.sh    | 26 ++++++++++++-------
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/package/base-files/Makefile b/package/base-files/Makefile
index 90c68cd175..61043c295a 100644
--- a/package/base-files/Makefile
+++ b/package/base-files/Makefile
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=94
+PKG_RELEASE:=95
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 PKG_BUILD_DEPENDS:=opkg/host
diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh
index 0870f7de5c..e97958bf9b 100644
--- a/package/base-files/files/lib/upgrade/common.sh
+++ b/package/base-files/files/lib/upgrade/common.sh
@@ -80,19 +80,27 @@ run_ramfs() { # <command> [...]
 kill_remaining() { # [ <signal> ]
 	local sig="${1:-TERM}"
 	echo -n "Sending $sig to remaining processes ... "
-	/bin/busybox top -bn1 2>/dev/null | while read pid ppid user stat vsz pvsz pcpu cmd args; do
-		case "$pid" in
-			[0-9]*) : ;;
-			*) continue ;;
-		esac
-		case "$cmd" in
-			# Skip kernel threads and essential services
-			\[*\]|*ash*|*init*|*watchdog*|*ssh*|*dropbear*|*telnet*|*login*|*ubusd*|*netifd*|*hostapd*|*wpa_supplicant*|*udhcpc*) : ;;
+
+	local stat
+	for stat in /proc/[0-9]*/stat; do
+		local pid name state ppid rest
+		read pid name state ppid rest < $stat
+		name="${name#(}"; name="${name%)}"
+
+		local cmdline
+		read cmdline < /proc/$pid/cmdline
+
+		# Skip kernel threads 
+		[ -n "$cmdline" ] || continue
+
+		case "$name" in
+			# Skip essential services
+			*ash*|*init*|*watchdog*|*ssh*|*dropbear*|*telnet*|*login*|*ubusd*|*netifd*|*hostapd*|*wpa_supplicant*|*udhcpc*) : ;;
 
 			# Killable process
 			*)
 				if [ $pid -ne $$ ] && [ $ppid -ne $$ ]; then
-					echo -n "${cmd##*/} "
+					echo -n "$name "
 					kill -$sig $pid 2>/dev/null
 				fi
 			;;
-- 
GitLab