]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
base/init: kill loginit after one second of waiting
authorHarald Hoyer <harald@redhat.com>
Wed, 7 Oct 2009 12:03:19 +0000 (14:03 +0200)
committerHarald Hoyer <harald@redhat.com>
Wed, 7 Oct 2009 14:09:20 +0000 (16:09 +0200)
modules.d/99base/init

index a5b565c3aa79255fd0048dba6f34775429b5c285..24832abdce220bb938ecb24d356c9bc0128a0b0e 100755 (executable)
@@ -2,15 +2,40 @@
 #
 # Licensed under the GPLv2
 #
-# Copyright 2008, Red Hat, Inc.
+# Copyright 2008-2009, Red Hat, Inc.
+# Harald Hoyer <harald@redhat.com>
 # Jeremy Katz <katzj@redhat.com>
 
+wait_for_loginit()
+{
+    if getarg rdinitdebug; then
+       set +x
+       exec 1>- 2>-
+       exec 0<>/dev/console 1<>/dev/console 2<>/dev/console
+       # wait for loginit
+       i=0
+       while [ $i -lt 10 ]; do 
+           j=$(jobs)
+           [ -z "$j" ] && break
+           [ -z "${j##*Running*}" ] || break
+           sleep 0.1
+           i=$[$i+1]
+       done    
+       [ $i -eq 10 ] && kill %1 >/dev/null 2>&1
+
+        while pidof -x /sbin/loginit >/dev/null 2>&1; do
+            for pid in $(pidof -x /sbin/loginit); do
+                kill $HARD $pid >/dev/null 2>&1
+            done
+            HARD="-9"
+        done
+       set -x
+    fi
+}
+
 emergency_shell()
 {
-    set +x
-    exec 0<>/dev/console 1<>/dev/console 2<>/dev/console
-    # wait for loginit
-    wait
+    wait_for_loginit
     echo ; echo
     echo $@
     source_all emergency
@@ -58,7 +83,10 @@ if getarg rdinitdebug; then
     mkfifo /dev/initlog.pipe
     /sbin/loginit $DRACUT_QUIET </dev/initlog.pipe >/dev/console 2>&1 &
     exec >/dev/initlog.pipe 2>&1
+else
+    exec 0<>/dev/console 1<>/dev/console 2<>/dev/console
 fi
+
 setdebug
 
 mkdir /dev/shm
@@ -245,9 +273,7 @@ fi
 
 info "Switching root"
 
-exec 0<>/dev/console 1<>/dev/console 2<>/dev/console
-# wait for loginit
-wait
+wait_for_loginit
 
 exec switch_root "$NEWROOT" "$INIT" $initargs || {
     echo "Something went very badly wrong in the initramfs.  Please "