[Pkg-sysvinit-devel] Modifying killall5 exit status values to speed up shutdown

Petter Reinholdtsen pere at hungry.com
Mon Sep 11 11:15:21 UTC 2006


I would like to get rid of the 'sleep 5 in sendsigs, and stop waiting
when there are no more processes to wait for.  For this to work, I
propose to change the exit status values from killall5, to make it
possible to get feedback if there are no more processes to kill.

With such change in place, we can do something like this in sendsigs:

       for seq in 1 2 3 4 5 ; do
               sleep 1
               # use SIGCONT to check if there are processes left.
               killall5 -18 || break
       done

I propose this patch to let it return the value 2 if there are no more
processes to kill.  Is it OK to commit as 82_killall_retval.dpatch, or
are there other proposals?

Index: sysvinit/man/killall5.8
===================================================================
--- sysvinit/man/killall5.8	(revision 856)
+++ sysvinit/man/killall5.8	(working copy)
@@ -10,6 +10,10 @@
 kernel threads and the processes in its own session, so it won't kill
 the shell that is running the script it was called from. Its primary
 (only) use is in the \fBrc\fP scripts found in the /etc/init.d directory.
+.SH EXIT STATUS
+The program return zero if it killed processes.  It return 2 if no
+process were killed, and 1 if it was unable to find any processes
+(/proc/ is missing).
 .SH SEE ALSO
 .BR halt (8),
 .BR reboot (8)
Index: sysvinit/src/killall5.c
===================================================================
--- sysvinit/src/killall5.c	(revision 856)
+++ sysvinit/src/killall5.c	(working copy)
@@ -603,6 +603,9 @@
 	int		pid, sid = -1;
 	int		sig = SIGKILL;
 
+	/* return non-zero if no process was killed */
+	int		retval = 2;
+
 	/* Get program name. */
 	if ((progname = strrchr(argv[0], '/')) == NULL)
 		progname = argv[0];
@@ -643,15 +646,17 @@
 	/* Read /proc filesystem */
 	if (readproc(1) < 0) {
 		kill(-1, SIGCONT);
-		exit(1);
+		return(1);
 	}
 
 	/* Now kill all processes except init (pid 1) and our session. */
 	sid = (int)getsid(0);
 	pid = (int)getpid();
 	for (p = plist; p; p = p->next)
-		if (p->pid != 1 && p->pid != pid && p->sid != sid && !p->kernel)
+		if (p->pid != 1 && p->pid != pid && p->sid != sid && !p->kernel) {
 			kill(p->pid, sig);
+			retval = 0;
+		}
 
 	/* And let them continue. */
 	kill(-1, SIGCONT);
@@ -662,5 +667,5 @@
 	/* Force the kernel to run the scheduler */
 	usleep(1);
 
-	return 0;
+	return retval;
 }


Here is the patch I propose for sendsigs.  It is tested, and for my
test machine it reduces the wait time from 5 to 2 seconds.

Index: debian/initscripts/etc/init.d/sendsigs
===================================================================
--- debian/initscripts/etc/init.d/sendsigs      (revisjon 900)
+++ debian/initscripts/etc/init.d/sendsigs      (arbeidskopi)
@@ -16,11 +16,15 @@
 do_stop () {
        # Kill all processes.
        log_action_begin_msg "Asking all remaining processes to terminate"
-       killall5 -15
+       killall5 -15 # SIGTERM
        log_action_end_msg 0
-       sleep 5
+       for seq in 1 2 3 4 5 ; do
+               sleep 1
+               # use SIGCONT to check if there are processes left.
+               killall5 -18 || break
+       done
        log_action_begin_msg "Killing all remaining processes"
-       killall5 -9
+       killall5 -9 # SIGKILL
        log_action_end_msg 0
 }




More information about the Pkg-sysvinit-devel mailing list