Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 17 May 2009 04:34:14 +0000 (UTC)
From:      Brian Somers <brian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r192242 - head/bin/pkill
Message-ID:  <200905170434.n4H4YEDW014059@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905170434.n4H4YEDW014059>