Revert previous behaviour of '-F' option and add '-L' option, which will

tell pkill(1)/pgrep(1) to try to flock(2) pidfile before reading PID from
there.

Discussed with:	jhb, gad
This commit is contained in:
pjd 2005-08-25 20:10:47 +00:00
parent ca020ef784
commit fe9f2ab734
2 changed files with 44 additions and 28 deletions

View File

@ -44,7 +44,7 @@
.Nd find or signal processes by name
.Sh SYNOPSIS
.Nm pgrep
.Op Fl Sfilnovx
.Op Fl LSfilnovx
.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 finovx
.Op Fl Lfinovx
.Op Fl F Ar pidfile
.Op Fl G Ar gid
.Op Fl M Ar core
@ -91,16 +91,19 @@ The following options are available:
Restrict matches to a process whose PID is stored in the
.Ar pidfile
file.
The
.Ar pidfile
file must be locked with the
.Xr flock 2
syscall or created with
.Xr pidfile 3 .
.It Fl G Ar gid
Restrict matches to processes with a real group ID in the comma-separated
list
.Ar gid .
.It Fl L
The
.Ar pidfile
file given for the
.Fl F
option must be locked with the
.Xr flock 2
syscall or created with
.Xr pidfile 3 .
.It Fl M Ar core
Extract values associated with the name list from the specified core
instead of the currently running system.

View File

@ -124,17 +124,17 @@ void usage(void);
void killact(struct kinfo_proc *);
void grepact(struct kinfo_proc *);
void makelist(struct listhead *, enum listtype, char *);
int takepid(const char *);
int takepid(const char *, int);
int
main(int argc, char **argv)
{
extern char *optarg;
extern int optind;
char buf[_POSIX2_LINE_MAX], *mstr, **pargv, *p, *q;
char buf[_POSIX2_LINE_MAX], *mstr, **pargv, *p, *q, *pidfile;
const char *execf, *coref;
int debug_opt;
int i, ch, bestidx, rv, criteria, pidfromfile;
int i, ch, bestidx, rv, criteria, pidfromfile, pidfilelock;
size_t jsz;
void (*action)(struct kinfo_proc *);
struct kinfo_proc *kp;
@ -176,22 +176,26 @@ main(int argc, char **argv)
criteria = 0;
debug_opt = 0;
pidfromfile = -1;
pidfile = NULL;
pidfilelock = 0;
execf = coref = _PATH_DEVNULL;
while ((ch = getopt(argc, argv, "DF:G:M:N:P:SU:d:fg:ij:lnos:t:u:vx")) != -1)
while ((ch = getopt(argc, argv, "DF:G:LM:N:P:SU:d:fg:ij:lnos:t:u:vx")) != -1)
switch (ch) {
case 'D':
debug_opt++;
break;
case 'F':
pidfromfile = takepid(optarg);
pidfile = optarg;
criteria = 1;
break;
case 'G':
makelist(&rgidlist, LT_GROUP, optarg);
criteria = 1;
break;
case 'L':
pidfilelock = 1;
break;
case 'M':
coref = optarg;
break;
@ -274,6 +278,13 @@ main(int argc, char **argv)
usage();
if (newest && oldest)
errx(STATUS_ERROR, "-n and -o are mutually exclusive");
if (pidfile != NULL)
pidfromfile = takepid(pidfile, pidfilelock);
else {
if (pidfilelock)
errx(STATUS_ERROR, "-L doesn't make sense without -F");
pidfromfile = -1;
}
mypid = getpid();
@ -497,9 +508,9 @@ usage(void)
const char *ustr;
if (pgrep)
ustr = "[-Sfilnovx] [-d delim]";
ustr = "[-LSfilnovx] [-d delim]";
else
ustr = "[-signal] [-finovx]";
ustr = "[-signal] [-Lfinovx]";
fprintf(stderr,
"usage: %s %s [-F pidfile] [-G gid] [-M core] [-N system]\n"
@ -631,7 +642,7 @@ makelist(struct listhead *head, enum listtype type, char *src)
}
int
takepid(const char *pidfile)
takepid(const char *pidfile, int pidfilelock)
{
char *endp, line[BUFSIZ];
FILE *fh;
@ -641,17 +652,19 @@ takepid(const char *pidfile)
if (fh == NULL)
err(STATUS_ERROR, "can't open pid file `%s'", pidfile);
/*
* If we can lock pidfile, this means that daemon is not running,
* so better don't kill the process from the pidfile.
*/
if (flock(fileno(fh), LOCK_EX | LOCK_NB) == 0) {
(void)fclose(fh);
errx(STATUS_ERROR, "file '%s' can be locked", pidfile);
} else {
if (errno != EWOULDBLOCK) {
errx(STATUS_ERROR, "error while locking file '%s'",
pidfile);
if (pidfilelock) {
/*
* If we can lock pidfile, this means that daemon is not
* running, so would be better not to kill some random process.
*/
if (flock(fileno(fh), LOCK_EX | LOCK_NB) == 0) {
(void)fclose(fh);
errx(STATUS_ERROR, "file '%s' can be locked", pidfile);
} else {
if (errno != EWOULDBLOCK) {
errx(STATUS_ERROR,
"error while locking file '%s'", pidfile);
}
}
}