[package] base-files: sysupgrade: kill all but essential processes before starting...
authorJo-Philipp Wich <jow@openwrt.org>
Thu, 27 Oct 2011 16:52:31 +0000 (16:52 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 27 Oct 2011 16:52:31 +0000 (16:52 +0000)
SVN-Revision: 28626

package/base-files/Makefile
package/base-files/files/lib/upgrade/common.sh
package/base-files/files/sbin/sysupgrade

index 7e895f1..5afe3dc 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=84
+PKG_RELEASE:=85
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 PKG_BUILD_DEPENDS:=opkg/host
index 65ce816..2126ca1 100644 (file)
@@ -77,6 +77,30 @@ run_ramfs() { # <command> [...]
        exec /bin/busybox ash -c "$*"
 }
 
+kill_remaining() { # [ <signal> ]
+       local sig="${1:-TERM}"
+       echo -n "Sending $sig to remaing processes ... "
+       top -bn1 | 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*) : ;;
+
+                       # Killable process
+                       *)
+                               if [ $pid -ne $$ ] && [ $ppid -ne $$ ]; then
+                                       echo -n "${cmd##*/} "
+                                       kill -$sig $pid 2>/dev/null
+                               fi
+                       ;;
+               esac
+       done
+       echo ""
+}
+
 run_hooks() {
        local arg="$1"; shift
        for func in "$@"; do
index 7efb2b4..d251cc9 100755 (executable)
@@ -127,6 +127,11 @@ elif ask_bool $SAVE_CONFIG "Keep config files over reflash"; then
 else
        export SAVE_CONFIG=0
 fi
+
+kill_remaining TERM
+sleep 3
+kill_remaining KILL
+
 run_hooks "" $sysupgrade_pre_upgrade
 
 if [ -n "$(rootfs_type)" ]; then