[patch] add pwait utility

View: New views
9 Messages — Rating Filter:   Alert me  

[patch] add pwait utility

by Jilles Tjoelker :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

--
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 utility

by Ulrich Spörlein-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On 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 utility

by Eugene Grosbein-6 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On 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 utility

by Gary Jennejohn-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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?

---
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 utility

by Kostik Belousov :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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.


attachment0 (203 bytes) Download Attachment

Re: [patch] add pwait utility

by Rui Paulo-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On 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 utility

by Jilles Tjoelker :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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?
> 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 utility

by Doug Barton :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Jilles 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 utility

by Gabor Kovesdan-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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