Three new flags for pkill/pgrep.
Pawel Jakub Dawidek
pjd at FreeBSD.org
Sat Mar 12 08:19:12 PST 2005
On Sat, Mar 12, 2005 at 03:19:41PM +0100, Pawel Jakub Dawidek wrote:
+> Two more patches:
+>
+> pkill_09.patch - Fix '-n' option.
+> pkill_10.patch - Adds '-S' option to include kernel threads (only in pgrep).
One more:
pkill_11.patch - Add '-o' option - Select only the oldest (least recently
started) of the matching processes.
'-o' option for pgrep/pkill can be also found in Solaris and Linux.
--
Pawel Jakub Dawidek http://www.wheel.pl
pjd at FreeBSD.org http://www.FreeBSD.org
FreeBSD committer Am I Evil? Yes, I Am!
-------------- next part --------------
http://perforce.freebsd.org/chv.cgi?CH=72975
Change 72975 by pjd at pjd_anger on 2005/03/12 15:51:12
Add '-o' option which allows to select the oldest of the matching
processes.
This option exists in Solaris and Linux.
Affected files ...
.. //depot/user/pjd/pkill/usr.bin/pkill/pkill.1#7 edit
.. //depot/user/pjd/pkill/usr.bin/pkill/pkill.c#9 edit
Differences ...
==== //depot/user/pjd/pkill/usr.bin/pkill/pkill.1#7 (text+ko) ====
@@ -147,7 +147,9 @@
.Nm pgrep
command.
.It Fl n
-Match only the most recently created process, if any.
+Select only the newest (most recently started) of the matching processes.
+.It Fl o
+Select only the oldest (least recently started) of the matching processes.
.It Fl s Ar sid
Restrict matches to processes with a session ID in the comma-separated
list
==== //depot/user/pjd/pkill/usr.bin/pkill/pkill.c#9 (text+ko) ====
@@ -99,6 +99,7 @@
int pgrep;
int signum = SIGTERM;
int newest;
+int oldest;
int inverse;
int longfmt;
int matchargs;
@@ -132,12 +133,11 @@
char buf[_POSIX2_LINE_MAX], *mstr, **pargv, *p, *q;
const char *execf, *coref;
int debug_opt;
- int i, ch, bestidx, rv, criteria, pidfromfile;
+ int i, ch, rv, criteria, pidfromfile;
size_t jsz;
void (*action)(struct kinfo_proc *);
struct kinfo_proc *kp;
struct list *li;
- struct timeval best_tval;
regex_t reg;
regmatch_t regmatch;
@@ -177,7 +177,7 @@
pidfromfile = -1;
execf = coref = _PATH_DEVNULL;
- while ((ch = getopt(argc, argv, "DF:G:M:N:P:SU:d:fg:ij:lns:t:u:vx")) != -1)
+ while ((ch = getopt(argc, argv, "DF:G:M:N:P:SU:d:fg:ij:lnos:t:u:vx")) != -1)
switch (ch) {
case 'D':
debug_opt++;
@@ -237,6 +237,10 @@
newest = 1;
criteria = 1;
break;
+ case 'o':
+ oldest = 1;
+ criteria = 1;
+ break;
case 's':
makelist(&sidlist, LT_SID, optarg);
criteria = 1;
@@ -266,6 +270,8 @@
criteria = 1;
if (!criteria)
usage();
+ if (newest && oldest)
+ errx(STATUS_ERROR, "-n and -o are mutually exclusive");
mypid = getpid();
@@ -434,23 +440,29 @@
selected[i] = 1;
}
- if (newest) {
+ if (newest || oldest) {
+ struct timeval best_tval;
+ int bestidx;
+
best_tval.tv_sec = 0;
best_tval.tv_usec = 0;
bestidx = -1;
+#define PNEWER(kp) ((kp)->ki_start.tv_sec > best_tval.tv_sec || \
+ ((kp)->ki_start.tv_sec == best_tval.tv_sec && \
+ (kp)->ki_start.tv_usec > best_tval.tv_usec))
for (i = 0, kp = plist; i < nproc; i++, kp++) {
if (!selected[i])
continue;
-
- if (kp->ki_start.tv_sec > best_tval.tv_sec ||
- (kp->ki_start.tv_sec == best_tval.tv_sec
- && kp->ki_start.tv_usec > best_tval.tv_usec)) {
+ if (bestidx == -1 ||
+ (newest && PNEWER(kp)) ||
+ (oldest && !PNEWER(kp))) {
best_tval.tv_sec = kp->ki_start.tv_sec;
best_tval.tv_usec = kp->ki_start.tv_usec;
bestidx = i;
}
}
+#undef PNEWER
memset(selected, 0, nproc);
if (bestidx != -1)
@@ -481,9 +493,9 @@
const char *ustr;
if (pgrep)
- ustr = "[-Sfilnvx] [-d delim]";
+ ustr = "[-Sfilnovx] [-d delim]";
else
- ustr = "[-signal] [-finvx]";
+ ustr = "[-signal] [-finovx]";
fprintf(stderr,
"usage: %s %s [-F pidfile] [-G gid] [-M core] [-N system]\n"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-current/attachments/20050312/d2204fe4/attachment.bin
More information about the freebsd-current
mailing list