[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