|
View:
New views
9 Messages
—
Rating Filter:
Alert me
|
|
|
[patch] add pwait utilityI propose adding a small new utility to /usr/bin: pwait. Similar to the
Solaris utility of the same name, it waits for any process to terminate. Some use cases I have in mind: * rc.subr's wait_for_pids. This is a cleaner and more efficient fix for PR conf/132766. In the rare case that /usr is not available, the old sleep(1) method can be used. * interactive use, e.g. to shut down the computer when some task is done even if the task is already running -- Jilles Tjoelker Index: usr.bin/pwait/pwait.1 =================================================================== --- usr.bin/pwait/pwait.1 (revision 0) +++ usr.bin/pwait/pwait.1 (revision 0) @@ -0,0 +1,78 @@ +.\" +.\" Copyright (c) 2004-2009, Jilles Tjoelker +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with +.\" or without modification, are permitted provided that the +.\" following conditions are met: +.\" +.\" 1. Redistributions of source code must retain the above +.\" copyright notice, this list of conditions and the +.\" following disclaimer. +.\" 2. Redistributions in binary form must reproduce the +.\" above copyright notice, this list of conditions and +.\" the following disclaimer in the documentation and/or +.\" other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +.\" CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +.\" WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +.\" PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +.\" COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +.\" DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +.\" CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +.\" USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +.\" OF SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd November 1, 2009 +.Os +.Dt PWAIT 1 +.Sh NAME +.Nm pwait +.Nd wait for processes to terminate +.Sh SYNOPSIS +.Nm +.Op Fl v +.Ar pid +\&... +.Sh DESCRIPTION +The +.Nm +utility will wait until each of the given processes has terminated. +.Pp +The following option is available: +.Bl -tag -width indent +.It Fl v +Print the exit status when each process terminates. +.El +.Sh DIAGNOSTICS +.Pp +The +.Nm +utility returns 0 on success, and >0 if an error occurs. +.Pp +Invalid pids elicit a warning message but are otherwise ignored. +.Sh SEE ALSO +.Xr kill 1 , +.Xr pkill 1 , +.Xr ps 1 , +.Xr wait 1 , +.Xr kqueue 2 +.Sh NOTES +.Nm +is not a substitute for the +.Xr wait 1 +builtin +as it will not clean up any zombies or state in the parent process. +.Sh HISTORY +A +.Nm +command first appeared in SunOS 5.8. Property changes on: usr.bin/pwait/pwait.1 ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + FreeBSD=%H Added: svn:eol-style + native Index: usr.bin/pwait/pwait.c =================================================================== --- usr.bin/pwait/pwait.c (revision 0) +++ usr.bin/pwait/pwait.c (revision 0) @@ -0,0 +1,148 @@ +/*- + * Copyright (c) 2004-2009, Jilles Tjoelker + * All rights reserved. + * + * Redistribution and use in source and binary forms, with + * or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and + * the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/types.h> +#include <sys/event.h> +#include <sys/time.h> +#include <sys/wait.h> + +#include <err.h> +#include <errno.h> +#include <fcntl.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sysexits.h> +#include <unistd.h> + +static void +usage(void) +{ + + fprintf(stderr, "usage: pwait [-v] pid ...\n"); + exit(EX_USAGE); +} + +/* + * pwait - wait for processes to terminate + */ +int +main(int argc, char *argv[]) +{ + int kq; + struct kevent *e; + int verbose = 0; + int opt, nleft, n, i, duplicate, status; + long pid; + char *s, *end; + + while ((opt = getopt(argc, argv, "v")) != -1) { + switch (opt) { + case 'v': + verbose = 1; + break; + default: + usage(); + /* NOTREACHED */ + } + } + + argc -= optind; + argv += optind; + + if (argc == 0) + usage(); + + kq = kqueue(); + if (kq == -1) + err(1, "kqueue"); + + e = malloc(argc * sizeof(struct kevent)); + if (e == NULL) + err(1, "malloc"); + nleft = 0; + for (n = 0; n < argc; n++) { + s = argv[n]; + if (!strncmp(s, "/proc/", 6)) /* Undocumented Solaris compat */ + s += 6; + errno = 0; + pid = strtol(s, &end, 10); + if (pid < 0 || *end != '\0' || errno != 0) { + warnx("%s: bad process id", s); + continue; + } + duplicate = 0; + for (i = 0; i < nleft; i++) + if (e[i].ident == (uintptr_t)pid) + duplicate = 1; + if (!duplicate) { + EV_SET(e + nleft, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, + 0, NULL); + if (kevent(kq, e + nleft, 1, NULL, 0, NULL) == -1) + warn("%ld", pid); + else + nleft++; + } + } + + if (nleft == 0) + exit(0); /* Solaris does this too. */ + + while (nleft > 0) { + n = kevent(kq, NULL, 0, e, nleft, NULL); + if (n == -1) + err(1, "kevent"); + if (verbose) + for (i = 0; i < n; i++) { + status = e[i].data; + if (WIFEXITED(status)) + printf("%ld: exited with status %d.\n", + (long)e[i].ident, + WEXITSTATUS(status)); + else if (WIFSIGNALED(status)) + printf("%ld: killed by signal %d.\n", + (long)e[i].ident, + WTERMSIG(status)); + else + printf("%ld: terminated.\n", + (long)e[i].ident); + } + nleft -= n; + } + + return 0; +} Property changes on: usr.bin/pwait/pwait.c ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + FreeBSD=%H Added: svn:eol-style + native Index: usr.bin/pwait/Makefile =================================================================== --- usr.bin/pwait/Makefile (revision 0) +++ usr.bin/pwait/Makefile (revision 0) @@ -0,0 +1,7 @@ +# $FreeBSD$ + +PROG= pwait + +WARNS?= 6 + +.include <bsd.prog.mk> Property changes on: usr.bin/pwait/Makefile ___________________________________________________________________ Added: svn:mime-type + text/plain Added: svn:keywords + FreeBSD=%H Added: svn:eol-style + native Index: usr.bin/Makefile =================================================================== --- usr.bin/Makefile (revision 198703) +++ usr.bin/Makefile (working copy) @@ -154,6 +154,7 @@ printenv \ printf \ procstat \ + pwait \ ${_quota} \ renice \ rev \ _______________________________________________ freebsd-hackers@... mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@..." |
|
|
Re: [patch] add pwait utilityOn Fri, 06.11.2009 at 23:24:46 +0100, Jilles Tjoelker wrote:
> I propose adding a small new utility to /usr/bin: pwait. Similar to the > Solaris utility of the same name, it waits for any process to terminate. > Some use cases I have in mind: > > * rc.subr's wait_for_pids. This is a cleaner and more efficient fix for > PR conf/132766. In the rare case that /usr is not available, the old > sleep(1) method can be used. > * interactive use, e.g. to shut down the computer when some task is done > even if the task is already running Hi Jilles, this is great! I found no sleep(3) calls in the code and it looks like the kevent stuff will make pwait exit the instant the PID is gone. This is really nice and should be used to improve wait_for_pids. I understand that shutdown duration is of zero importance for server operations, but when using FreeBSD on the desktop or laptop I often do "halt -p", just because it is seriously faster and I know the implications. A slower machine of mine is calling sleep(1) inside wait_for_pid way too often during shutdown. I'd also vote to reduce the sleep(1) call from 2s to 0.5s. Gotta do some benchmarking here ... Regards, Uli _______________________________________________ freebsd-hackers@... mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@..." |
|
|
Re: [patch] add pwait utilityOn Fri, Nov 06, 2009 at 11:24:46PM +0100, Jilles Tjoelker wrote:
> I propose adding a small new utility to /usr/bin: pwait. Similar to the > Solaris utility of the same name, it waits for any process to terminate. > Some use cases I have in mind: > > * rc.subr's wait_for_pids. This is a cleaner and more efficient fix for > PR conf/132766. In the rare case that /usr is not available, the old > sleep(1) method can be used. > * interactive use, e.g. to shut down the computer when some task is done > even if the task is already running I've always missed such command exactly for later case :-) Vote for it. Eugene Grosbein _______________________________________________ freebsd-hackers@... mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@..." |
|
|
Re: [patch] add pwait utilityOn Fri, 6 Nov 2009 23:24:46 +0100
Jilles Tjoelker <jilles@...> wrote: > I propose adding a small new utility to /usr/bin: pwait. Similar to the > Solaris utility of the same name, it waits for any process to terminate. > Why not /bin so it can be used before /usr is mounted? --- Gary Jennejohn _______________________________________________ freebsd-hackers@... mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@..." |
|
|
Re: [patch] add pwait utilityOn Sat, Nov 07, 2009 at 11:28:32AM +0100, Gary Jennejohn wrote:
> On Fri, 6 Nov 2009 23:24:46 +0100 > Jilles Tjoelker <jilles@...> wrote: > > > I propose adding a small new utility to /usr/bin: pwait. Similar to the > > Solaris utility of the same name, it waits for any process to terminate. > > > > Why not /bin so it can be used before /usr is mounted? And it seems to make sense to add this functionality to pkill/pgrep binary, creating another hardlink to it. |
|
|
Re: [patch] add pwait utilityOn 7 Nov 2009, at 07:02, Ulrich Spörlein wrote:
> I understand that shutdown duration is of zero importance for server > operations, FWIW, I don't agree with this. -- Rui Paulo _______________________________________________ freebsd-hackers@... mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@..." |
|
|
Re: [patch] add pwait utilityOn Sat, Nov 07, 2009 at 03:01:36PM +0200, Kostik Belousov wrote:
> On Sat, Nov 07, 2009 at 11:28:32AM +0100, Gary Jennejohn wrote: > > On Fri, 6 Nov 2009 23:24:46 +0100 > > Jilles Tjoelker <jilles@...> wrote: > > > I propose adding a small new utility to /usr/bin: pwait. Similar to the > > > Solaris utility of the same name, it waits for any process to terminate. > > Why not /bin so it can be used before /usr is mounted? > And it seems to make sense to add this functionality to pkill/pgrep > binary, creating another hardlink to it. Hmm, pwait's syntax is incompatible: it takes pids (pkill says: use kill) and the -v option does something totally different. -- Jilles Tjoelker _______________________________________________ freebsd-hackers@... mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@..." |
|
|
Re: [patch] add pwait utilityJilles Tjoelker wrote:
> On Sat, Nov 07, 2009 at 03:01:36PM +0200, Kostik Belousov wrote: >> On Sat, Nov 07, 2009 at 11:28:32AM +0100, Gary Jennejohn wrote: >>> On Fri, 6 Nov 2009 23:24:46 +0100 >>> Jilles Tjoelker <jilles@...> wrote: > >>>> I propose adding a small new utility to /usr/bin: pwait. Similar to the >>>> Solaris utility of the same name, it waits for any process to terminate. > >>> Why not /bin so it can be used before /usr is mounted? I agree. It's such a tiny thing there's no reason not to put it in /bin, and the potential benefits (being able to use it when /usr is not present) far outweigh the costs. >> And it seems to make sense to add this functionality to pkill/pgrep >> binary, creating another hardlink to it. > > Hmm, pwait's syntax is incompatible: it takes pids (pkill says: use > kill) and the -v option does something totally different. I agree with Jilles, I don't see any reason to complicate this. If there is some reason that pkill/pgrep would need the functionality internally then the pwait stuff could be turned into a library, but I don't think that's what Kostik was proposing. When you get this committed (in whatever form) send a note to freebsd-rc@... so that we can look at re-implementing wait_for_pids with this. I think this is a very nice addition, thanks for taking it on. Doug -- Improve the effectiveness of your Internet presence with a domain name makeover! http://SupersetSolutions.com/ _______________________________________________ freebsd-hackers@... mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@..." |
|
|
Re: [patch] add pwait utilityJilles Tjoelker escribió:
>> And it seems to make sense to add this functionality to pkill/pgrep >> binary, creating another hardlink to it. >> > > Hmm, pwait's syntax is incompatible: it takes pids (pkill says: use > kill) and the -v option does something totally different. > That's not an issue. You can declare extern char *__progname; and use it to parse the command line arguments in a different way. Of course, it only makes sense if pkill/pgrep has some inner functionality you can make use of to avoid duplication. -- Gabor Kovesdan FreeBSD Volunteer EMAIL: gabor@... .:|:. gabor@... WEB: http://people.FreeBSD.org/~gabor .:|:. http://kovesdan.org _______________________________________________ freebsd-hackers@... mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@..." |
| Free embeddable forum powered by Nabble | Forum Help |