Hi

I think that error message is misleading if you are running pkill as
root.

How about instead of only printing if it did nothing, -l makes it always
print "%d processes signalled"?



On Sun, Jan 15, 2012 at 06:26:39PM +0000, Mark Lumsden wrote:
> Some months ago there was an email about adding a 'i' option
> to pgrep/pkill, one suggestion from that discussion was giving
> pkill the ability to say if nothing had been killed.
> 
> http://marc.info/?l=openbsd-tech&m=130789344027691&w=2
> 
> I must say, I liked this idea. But only got time recently
> to have a look. Anyway FreeBSD has the code. Here it is
> imported into OpenBSD's pgrep/pkill. The diff does 
> slightly more than just inform you of no kills, but I
> like that aspect as well.
> 
> Comments/oks?
> 
> -lum
> 
> Index: pkill.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/pkill/pkill.1,v
> retrieving revision 1.16
> diff -u -p -r1.16 pkill.1
> --- pkill.1   29 Sep 2010 07:44:56 -0000      1.16
> +++ pkill.1   15 Jan 2012 18:03:00 -0000
> @@ -48,7 +48,7 @@
>  .Op Ar pattern ...
>  .Nm pkill
>  .Op Fl Ar signal
> -.Op Fl fnovx
> +.Op Fl flnovx
>  .Op Fl G Ar gid
>  .Op Fl g Ar pgrp
>  .Op Fl P Ar ppid
> @@ -100,9 +100,9 @@ process.
>  If used in conjunction with
>  .Fl f ,
>  print the process ID and the full argument list for each matching process.
> -This option can only be used with the
> -.Nm pgrep
> -command.
> +For
> +.Nm pkill ,
> +display the kill command used for each process killed.
>  .It Fl n
>  Match only the most recently created (newest) process, if any.
>  Cannot be used in conjunction with
> Index: pkill.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/pkill/pkill.c,v
> retrieving revision 1.19
> diff -u -p -r1.19 pkill.c
> --- pkill.c   10 Apr 2011 03:20:59 -0000      1.19
> +++ pkill.c   15 Jan 2012 18:03:00 -0000
> @@ -112,6 +112,7 @@ main(int argc, char **argv)
>       char buf[_POSIX2_LINE_MAX], *mstr, **pargv, *p, *q;
>       int i, j, ch, bestidx, rv, criteria;
>       int (*action)(struct kinfo_proc *, int);
> +     int did_action;
>       struct kinfo_proc *kp;
>       struct list *li;
>       u_int32_t bestsec, bestusec;
> @@ -176,8 +177,6 @@ main(int argc, char **argv)
>                       criteria = 1;
>                       break;
>               case 'l':
> -                     if (!pgrep)
> -                             usage();
>                       longfmt = 1;
>                       break;
>               case 'n':
> @@ -392,11 +391,16 @@ main(int argc, char **argv)
>       /*
>        * Take the appropriate action for each matched process, if any.
>        */
> +     did_action = 0;
>       rv = STATUS_NOMATCH;
>       for (i = 0, j = 0, kp = plist; i < nproc; i++, kp++) {
>               if ((kp->p_flag & P_SYSTEM) != 0 || kp->p_pid == mypid)
>                       continue;
>               if (selected[i]) {
> +                     if (longfmt && !pgrep) {
> +                             did_action = 1;
> +                             printf("kill -%d %d\n", signum, (int)kp->p_pid);
> +                     }
>                       if (inverse)
>                               continue;
>               } else if (!inverse)
> @@ -407,6 +411,9 @@ main(int argc, char **argv)
>               else if (rv != STATUS_ERROR)
>                       rv = STATUS_MATCH;
>       }
> +        if (!did_action && !pgrep && longfmt)
> +                fprintf(stderr,
> +                    "No matching processes belonging to you were found\n");
>       if (pgrep && j)
>               putchar('\n');
>  
> @@ -421,7 +428,7 @@ usage(void)
>       if (pgrep)
>               ustr = "[-flnovx] [-d delim]";
>       else
> -             ustr = "[-signal] [-fnovx]";
> +             ustr = "[-signal] [-flnovx]";
>  
>       fprintf(stderr, "usage: %s %s [-G gid] [-g pgrp] [-P ppid] [-s sid] "
>           "[-t tty]\n\t[-U uid] [-u euid] [pattern ...]\n", __progname, ustr);

Reply via email to