[Pkg-sysvinit-commits] r1448 - in sysvinit-upstream/trunk: doc man src
Petter Reinholdtsen
pere at alioth.debian.org
Sun Jul 12 14:46:46 UTC 2009
Author: pere
Date: 2009-07-12 14:46:46 +0000 (Sun, 12 Jul 2009)
New Revision: 1448
Modified:
sysvinit-upstream/trunk/doc/Changelog
sysvinit-upstream/trunk/man/killall5.8
sysvinit-upstream/trunk/src/killall5.c
Log:
Add option -o opmitpid to killall5, to make it possible to skip
some pids during shutdown. Based on patch from Colin Watson and
Ubuntu.
Modified: sysvinit-upstream/trunk/doc/Changelog
===================================================================
--- sysvinit-upstream/trunk/doc/Changelog 2009-07-12 14:41:52 UTC (rev 1447)
+++ sysvinit-upstream/trunk/doc/Changelog 2009-07-12 14:46:46 UTC (rev 1448)
@@ -67,6 +67,9 @@
* Change killall to avoid killing init by mistake. Patch from SuSe.
* Change killall5 to use the exit value to report if it found any
processes to kill. Patch from Debian.
+ * Add option -o opmitpid to killall5, to make it possible to skip
+ some pids during shutdown. Based on patch from Colin Watson and
+ Ubuntu.
-- Petter Reinholdtsen <pere at debian.org> Fri, 30 Jul 2004 14:14:58 +0200
Modified: sysvinit-upstream/trunk/man/killall5.8
===================================================================
--- sysvinit-upstream/trunk/man/killall5.8 2009-07-12 14:41:52 UTC (rev 1447)
+++ sysvinit-upstream/trunk/man/killall5.8 2009-07-12 14:46:46 UTC (rev 1448)
@@ -4,12 +4,19 @@
.SH SYNOPSIS
.B killall5
.RB -signalnumber
+.RB [ \-o
+.IR omitpid ]
+.RB [ \-o
+.IR omitpid.. ]
.SH DESCRIPTION
.B killall5
is the SystemV killall command. It sends a signal to all processes except
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 OPTIONS
+.IP "-o \fIomitpid\fP"
+Tells \fIkillall5\fP to omit processes with that process id.
.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
Modified: sysvinit-upstream/trunk/src/killall5.c
===================================================================
--- sysvinit-upstream/trunk/src/killall5.c 2009-07-12 14:41:52 UTC (rev 1447)
+++ sysvinit-upstream/trunk/src/killall5.c 2009-07-12 14:46:46 UTC (rev 1448)
@@ -609,11 +609,15 @@
+#define KILLALL_OMITSZ 16
+
/* Main for either killall or pidof. */
int main(int argc, char **argv)
{
PROC *p;
int pid, sid = -1;
+ pid_t opid[KILLALL_OMITSZ];
+ int i, oind, omit = 0;
int sig = SIGKILL;
/* return non-zero if no process was killed */
@@ -633,10 +637,34 @@
return main_pidof(argc, argv);
/* Right, so we are "killall". */
+ for (oind = KILLALL_OMITSZ-1; oind > 0; oind--)
+ opid[oind] = 0;
+
if (argc > 1) {
- if (argc != 2) usage();
- if (argv[1][0] == '-') (argv[1])++;
- if ((sig = atoi(argv[1])) <= 0 || sig > 31) usage();
+ for (i = 1; i < argc; i++) {
+ if (argv[i][0] == '-') (argv[i])++;
+ if (argv[i][0] == 'o') {
+ if (++i >= argc) usage();
+ if (oind >= KILLALL_OMITSZ -1) {
+ nsyslog(LOG_ERR,"omit pid buffer size "
+ "%d exceeded!\n",
+ KILLALL_OMITSZ);
+ closelog();
+ exit(1);
+ }
+ if ((opid[oind] = atoi(argv[i])) < 1) {
+ nsyslog(LOG_ERR,
+ "illegal omit pid value "
+ "(%s)!\n", argv[i]);
+ closelog();
+ exit(1);
+ }
+ oind++;
+ omit = 1;
+ }
+ else if ((sig = atoi(argv[1])) <= 0 || sig > 31)
+ usage();
+ }
}
/* First get the /proc filesystem online. */
@@ -665,11 +693,20 @@
/* 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) {
- kill(p->pid, sig);
- retval = 0;
+ for (p = plist; p; p = p->next) {
+ if (p->pid == 1 || p->pid == pid || p->sid == sid || p->kernel)
+ continue;
+ if (omit) {
+ for (i = 0; i < oind; i++)
+ if (opid[i] == p->pid)
+ break;
+ /* On a match, continue with the for loop above. */
+ if (i < oind)
+ continue;
}
+ kill(p->pid, sig);
+ retval = 0;
+ }
/* And let them continue. */
kill(-1, SIGCONT);
More information about the Pkg-sysvinit-commits
mailing list