misc/118205: new options -r to pkill(1) a pid after timeout
Jan Schaumann
jschauma at netmeister.org
Thu Nov 22 11:20:01 PST 2007
>Number: 118205
>Category: misc
>Synopsis: new options -r to pkill(1) a pid after timeout
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Thu Nov 22 19:20:00 UTC 2007
>Closed-Date:
>Last-Modified:
>Originator: Jan Schaumann
>Release:
>Organization:
>Environment:
>Description:
I occasionally have the need to kill a process iff it has been running
for longer than N seconds. Instead of parsing the output of ps(1) and
then calling kill(1) myself, I have attached a patch to add the "-r runtime"
flag to pkill(1).
See http://mail-index.netbsd.org/tech-userlevel/2007/07/26/0003.html for a discussion about this feature in NetBSD.
>How-To-Repeat:
>Fix:
Patch attached with submission follows:
diff -bur pkill.orig/pkill.1 pkill/pkill.1
--- pkill.orig/pkill.1 2006-12-20 03:57:22.000000000 -0800
+++ pkill/pkill.1 2007-11-22 11:10:15.000000000 -0800
@@ -50,6 +50,7 @@
.Op Fl M Ar core
.Op Fl N Ar system
.Op Fl P Ar ppid
+.Op Fl r Ar runtime
.Op Fl U Ar uid
.Op Fl d Ar delim
.Op Fl g Ar pgrp
@@ -66,6 +67,7 @@
.Op Fl M Ar core
.Op Fl N Ar system
.Op Fl P Ar ppid
+.Op Fl r Ar runtime
.Op Fl U Ar uid
.Op Fl g Ar pgrp
.Op Fl j Ar jid
@@ -116,6 +118,9 @@
Restrict matches to processes with a parent process ID in the
comma-separated list
.Ar ppid .
+.It Fl r Ar runtime
+Restrict matches to processes with a running time (ie wall clock) larger than
+.Ar runtime .
.It Fl S
Search also in system processes (kernel threads).
.It Fl U Ar uid
diff -bur pkill.orig/pkill.c pkill/pkill.c
--- pkill.orig/pkill.c 2006-11-23 03:55:17.000000000 -0800
+++ pkill/pkill.c 2007-11-22 11:13:03.000000000 -0800
@@ -106,6 +106,7 @@
static int interactive;
static int inverse;
static int longfmt;
+static int runtime;
static int matchargs;
static int fullmatch;
static int kthreads;
@@ -180,7 +181,7 @@
pidfilelock = 0;
execf = coref = _PATH_DEVNULL;
- while ((ch = getopt(argc, argv, "DF:G:ILM:N:P:SU:d:fg:ij:lnos:t:u:vx")) != -1)
+ while ((ch = getopt(argc, argv, "DF:G:ILM:N:P:SU:d:fg:ij:lnor:s:t:u:vx")) != -1)
switch (ch) {
case 'D':
debug_opt++;
@@ -252,6 +253,14 @@
oldest = 1;
criteria = 1;
break;
+ case 'r':
+ runtime = strtol(optarg, &q, 10);
+ if (*q) {
+ errx(EXIT_FAILURE, "illegal runtime: %s", optarg);
+ /* NOTREACHED */
+ }
+ criteria = 1;
+ break;
case 's':
makelist(&sidlist, LT_SID, optarg);
criteria = 1;
@@ -364,6 +373,14 @@
selected[i] = 1;
} else
selected[i] = 1;
+
+ if (runtime) {
+ if (kp->p_ustart_sec < (time(NULL) - runtime)) {
+ selected[i] = 1;
+ } else {
+ selected[i] = 0;
+ }
+ }
} else if (rv != REG_NOMATCH) {
regerror(rv, ®, buf, sizeof(buf));
errx(STATUS_ERROR,
@@ -464,9 +481,15 @@
continue;
}
- if (argc == 0)
+ if (argc == 0) {
+ if (runtime) {
+ if (kp->p_ustart_sec < (time(NULL) - runtime)) {
selected[i] = 1;
}
+ } else
+ selected[i] = 1;
+ }
+ }
if (newest || oldest) {
best_tval.tv_sec = 0;
@@ -528,9 +551,9 @@
fprintf(stderr,
"usage: %s %s [-F pidfile] [-G gid] [-M core] [-N system]\n"
- " [-P ppid] [-U uid] [-g pgrp] [-j jid] [-s sid]\n"
- " [-t tty] [-u euid] pattern ...\n", getprogname(),
- ustr);
+ " [-P ppid] [-U uid] [-g pgrp] [-j jid] [-r runtime]\n"
+ " [-s sid] [-t tty] [-u euid] pattern ...\n",
+ getprogname(), ustr);
exit(STATUS_BADUSAGE);
}
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list