sysupgrade: Enable killing of all processes under upgraded
authorJohn Crispin <john@openwrt.org>
Thu, 10 Jul 2014 19:16:27 +0000 (19:16 +0000)
committerJohn Crispin <john@openwrt.org>
Thu, 10 Jul 2014 19:16:27 +0000 (19:16 +0000)
If the sysupgrade scripts is called under upgraded, it will not kill all
other processes as it should to avoid interference by locked filesystem.
This patch checks the parent and if it is upgraded, it kills all.

Signed-off-by: André Valentin <avalentin@marcant.net>
SVN-Revision: 41563

package/base-files/files/lib/upgrade/common.sh

index 6f1880fba6c5a458394e7b9bfff5e5f2fcda4d16..ba9de99dc90d1991c134c121dba79ee975b4c87b 100644 (file)
@@ -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 ""
 }