On Sun, Aug 07, 2011 at 10:31:02AM +0200, Marc Haber wrote:
> when the daemon refuses to die (for example because the init script
> searches for the pidfile in the wrong place), the init script goes
> into an endless loop:
> 
>         if [ -n $pid ]; then
>           while kill -0 $pid 2>/dev/null; do
>             log_progress_msg "waiting for pid $pid to die"
>             sleep 1
>           done
>         fi
> 
> this causes the shutdown process to go into an uninterruptible endless
> loop, preventing the system from shutting down cleanly and forces a
> hard shutdown without properly umounting the file systems.
> 
> Please add a counter and don't wait indefinetely for the daemon to die.

I have exactly this problem - server fails to shutdown because it can't
stop a running bind daemon:

# /etc/init.d/bind9 stop
Stopping domain name service...: bind9 waiting for pid 3679 to die waiting for 
pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to die waiting 
for pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to die 
waiting for pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to 
die waiting for pid 3679 to die waiting for pid 3679 to die waiting for pid 
3679 to die waiting for pid 3679 to die waiting for pid 3679 to die waiting for 
pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to die waiting 
for pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to die 
waiting for pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to 
die waiting for pid 3679 to die waiting for pid 3679 to die waiting for pid 
3679 to die waiting for pid 3679 to die waiting for pid 3679 to die waiting for 
pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to die waiting 
for pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to die 
waiting for pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to 
die waiting for pid 3679 to die waiting for pid 3679 to die waiting for pid 
3679 to die waiting for pid 3679 to die waiting for pid 3679 to die waiting for 
pid 3679 to die waiting for pid 3679 to die waiting for pid 3679 to die waiting 
for pid 3679 to die

Proposed patch for bind init script is attached.

-- 
Valentin
--- bind9.dist	2011-09-09 17:16:47.000000000 +0200
+++ bind9	2011-09-09 17:18:14.000000000 +0200
@@ -89,10 +89,13 @@
 		    --pidfile ${PIDFILE} -- $OPTIONS
 	fi
 	if [ -n $pid ]; then
-	  while kill -0 $pid 2>/dev/null; do
-	    log_progress_msg "waiting for pid $pid to die"
-	    sleep 1
-	  done
+	    count=1
+	    while kill -0 $pid 2>/dev/null && [ $count -lt 60 ]; do
+		log_progress_msg "waiting for pid $pid to die"
+		sleep 1
+		count=$(($count+1))
+	    done
+	    [ $count -lt 60 ] || log_end_msg 1
 	fi
 	log_end_msg 0
     ;;

Reply via email to