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
This commit is contained in:
Brian Somers 2009-05-17 04:34:14 +00:00
parent 0fe5460dbd
commit 0a091aebde
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=192242
2 changed files with 40 additions and 5 deletions

View file

@ -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.

View file

@ -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;