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:
parent
fc0e3714cc
commit
a99453c14c
@ -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.
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user