Author: brian
Date: Sun May 17 04:34:14 2009
New Revision: 192242
URL: http://svn.freebsd.org/changeset/base/192242

Log:
  When finding processes, ignore ourself and our ancestors.  It is almost
  always surprising when you kill a 'sh -c ...' ancestor or when you kill
  yourself when using -f.
  
  Add a -a switch for backwards compatibility.
  
  MFC after:    3 weeks

Modified:
  head/bin/pkill/pkill.1
  head/bin/pkill/pkill.c

Modified: head/bin/pkill/pkill.1
==============================================================================
--- head/bin/pkill/pkill.1      Sun May 17 04:05:27 2009        (r192241)
+++ head/bin/pkill/pkill.1      Sun May 17 04:34:14 2009        (r192242)
@@ -36,7 +36,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd November 23, 2006
+.Dd May 16, 2009
 .Dt PKILL 1
 .Os
 .Sh NAME
@@ -44,7 +44,7 @@
 .Nd find or signal processes by name
 .Sh SYNOPSIS
 .Nm pgrep
-.Op Fl LSfilnovx
+.Op Fl LSafilnovx
 .Op Fl F Ar pidfile
 .Op Fl G Ar gid
 .Op Fl M Ar core
@@ -60,7 +60,7 @@
 .Ar pattern ...
 .Nm pkill
 .Op Fl Ar signal
-.Op Fl ILfinovx
+.Op Fl ILafinovx
 .Op Fl F Ar pidfile
 .Op Fl G Ar gid
 .Op Fl M Ar core
@@ -128,6 +128,15 @@ The default is a newline.
 This option can only be used with the
 .Nm pgrep
 command.
+.It Fl a
+Include process ancestors in the match list.
+By default, the current
+.Nm pgrep
+or
+.Nm pkill
+process and all of its ancestors are excluded (unless
+.Fl v
+is used).
 .It Fl f
 Match against full argument lists.
 The default is to match against process names.

Modified: head/bin/pkill/pkill.c
==============================================================================
--- head/bin/pkill/pkill.c      Sun May 17 04:05:27 2009        (r192241)
+++ head/bin/pkill/pkill.c      Sun May 17 04:34:14 2009        (r192242)
@@ -133,7 +133,7 @@ main(int argc, char **argv)
 {
        char buf[_POSIX2_LINE_MAX], *mstr, **pargv, *p, *q, *pidfile;
        const char *execf, *coref;
-       int debug_opt;
+       int ancestors, debug_opt;
        int i, ch, bestidx, rv, criteria, pidfromfile, pidfilelock;
        size_t jsz;
        int (*action)(const struct kinfo_proc *);
@@ -142,6 +142,7 @@ main(int argc, char **argv)
        struct timeval best_tval;
        regex_t reg;
        regmatch_t regmatch;
+       pid_t pid;
 
        setlocale(LC_ALL, "");
 
@@ -174,13 +175,14 @@ main(int argc, char **argv)
                }
        }
 
+       ancestors = 0;
        criteria = 0;
        debug_opt = 0;
        pidfile = NULL;
        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:ad:fg:ij:lnos:t:u:vx")) != -1)
                switch (ch) {
                case 'D':
                        debug_opt++;
@@ -220,6 +222,9 @@ main(int argc, char **argv)
                        makelist(&ruidlist, LT_USER, optarg);
                        criteria = 1;
                        break;
+               case 'a':
+                       ancestors++;
+                       break;
                case 'd':
                        if (!pgrep)
                                usage();
@@ -468,6 +473,27 @@ main(int argc, char **argv)
                        selected[i] = 1;
        }
 
+       if (!ancestors) {
+               pid = mypid;
+               while (pid) {
+                       for (i = 0, kp = plist; i < nproc; i++, kp++) {
+                               if (PSKIP(kp))
+                                       continue;
+                               if (kp->ki_pid == pid) {
+                                       selected[i] = 0;
+                                       pid = kp->ki_ppid;
+                                       break;
+                               }
+                       }
+                       if (i == nproc) {
+                               if (pid == mypid)
+                                       pid = getppid();
+                               else
+                                       break;  /* Maybe we're in a jail ? */
+                       }
+               }
+       }
+
        if (newest || oldest) {
                best_tval.tv_sec = 0;
                best_tval.tv_usec = 0;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to