commit 69044a11b873501fd894eaa71658bdf5d279109b
parent a25c05f78dd99311a8ae3337546dd82fee13c5dd
Author: Gerrit Pape <pape@smarden.org>
Date: Tue, 21 Sep 2004 18:08:37 +0000
* runsvdir.c: new option -P, run each runsv process in a new session and
process group (thx Charlie Brady).
* man/runsvdir.8: adapt; typo.
Diffstat:
4 files changed, 69 insertions(+), 44 deletions(-)
diff --git a/doc/runsvdir.8.html b/doc/runsvdir.8.html
@@ -12,42 +12,50 @@
runsvdir - starts and monitors a collection of <i>runsv(8)</i> processes
<h2><a name='sect1'>Synopsis</a></h2>
<b>runsvdir</b>
-<i>dir</i> [ <i>log</i> ]
+[-P] <i>dir</i> [ <i>log</i> ]
<h2><a name='sect2'>Description</a></h2>
-<i>dir</i> must be a directory. <i>log</i> is a space holder for
-a readproctitle log, and must be at least seven characters long or absent.
+<i>dir</i> must be a directory. <i>log</i> is a space holder
+for a readproctitle log, and must be at least seven characters long or
+absent. <p>
+<b>runsvdir</b> starts a <i><b>runsv</b>(8)</i> process for each subdirectory in the
+services directory <i>dir</i>, up to a limit of 1000 subdirectories. <b>runsvdir</b> skips
+subdirectory names starting with dots. <i><b>runsv</b>(8)</i> must be in <b>runsvdir</b>’s PATH.
<p>
-<b>runsvdir</b> starts a <i><b>runsv</b>(8)</i> process for each subdirectory in the services
-directory <i>dir</i>, up to a limit of 1000 subdirectories. <b>runsvdir</b> skips subdirectory
-names starting with dots. <i><b>runsv</b>(8)</i> must be in <b>runsvdir</b>’s PATH. <p>
-At least every
-five seconds, <b>runsvdir</b> checks if <i>dir</i> has changed. If it sees a new subdirectory
-in services directory <i>dir</i>, it starts a new <i><b>runsv</b>(8)</i> process. If it sees
-an old sudirectory where a <i><b>runsv</b>(8)</i> process has exited, it restarts the
-<i><b>runsv</b>(8)</i> process. If <b>runsvdir</b> sees a subdirectory being removed that was
-previously there, it sends the corresponding <i><b>runsv</b>(8)</i> process a TERM signal,
-stops monitoring this process, and so does not restart the <i><b>runsv</b>(8)</i> process
-if it exits. <p>
-If the <i>log</i> argument is given to <b>runsvdir</b>, all output to standard
-error is redirected to this <i>log</i>, which is similar to the <i><b>readproctitle</b>(8)</i>
-log. To see the most recent error messages, use a process-listing tool such
-as <i><b>ps</b>(1)</i>. <b>runsvdir</b> writes a dot to the readproctitle log every 15 minutes
-so that old error messages expire. <p>
-Normally <b>runsvdir</b> is started by <i><b>runit</b>(8)</i>
-in stage 2.
-<h2><a name='sect3'>Signals</a></h2>
+At least every five seconds <b>runsvdir</b> checks whether the services directory
+<i>dir</i> has changed. If it sees a new subdirectory in <i>dir</i>, it starts a new <i><b>runsv</b>(8)</i>
+process. If it sees an old sudirectory where a <i><b>runsv</b>(8)</i> process has exited,
+it restarts the <i><b>runsv</b>(8)</i> process. If <b>runsvdir</b> sees a subdirectory being
+removed that was previously there, it sends the corresponding <i><b>runsv</b>(8)</i>
+process a TERM signal, stops monitoring this process, and so does not restart
+the <i><b>runsv</b>(8)</i> process if it exits. <p>
+If the <i>log</i> argument is given to <b>runsvdir</b>,
+all output to standard error is redirected to this <i>log</i>, which is similar
+to the <i><b>readproctitle</b>(8)</i> log. To see the most recent error messages, use
+a process-listing tool such as <i><b>ps</b>(1)</i>. <b>runsvdir</b> writes a dot to the readproctitle
+log every 15 minutes so that old error messages expire.
+<h2><a name='sect3'>Options</a></h2>
+
+<dl>
+
+<dt><b>-P</b> </dt>
+<dd>use <i><b>setsid</b>(2)</i>
+to run each <i><b>runsv</b>(8)</i> process in a new session and separate process group.
+</dd>
+</dl>
+
+<h2><a name='sect4'>Signals</a></h2>
If <b>runsvdir</b> receives a TERM signal, it exits with 0 immediately.
<p>
If <b>runsvdir</b> receives a HUP signal, it sends a TERM signal to each <i><b>runsv</b>(8)</i>
process it is monitoring and then exits with 111.
-<h2><a name='sect4'>See Also</a></h2>
+<h2><a name='sect5'>See Also</a></h2>
<i>runsv(8)</i>, <i>runit(8)</i>,
<i>runit-init(8)</i>, <i>runsvchdir(8)</i>, <i>runsvctrl(8)</i>, <i>runsvstat(8)</i>, <i>chpst(8)</i>, <i>svlogd(8)</i>,
-<i>utmpset(8)</i>, <i>svwaitdown(8)</i>, <i>svwaitup(8)</i> <p>
-<i>http://smarden.org/runit/</i>
-<h2><a name='sect5'>Author</a></h2>
-Gerrit
-Pape <pape@smarden.org> <p>
+<i>utmpset(8)</i>, <i>svwaitdown(8)</i>, <i>svwaitup(8)</i>, <i>setsid(2)</i> <p>
+<i>http://smarden.org/runit/</i>
+
+<h2><a name='sect6'>Author</a></h2>
+Gerrit Pape <pape@smarden.org> <p>
<hr><p>
<a name='toc'><b>Table of Contents</b></a><p>
@@ -55,9 +63,10 @@ Pape <pape@smarden.org> <p>
<li><a name='toc0' href='#sect0'>Name</a></li>
<li><a name='toc1' href='#sect1'>Synopsis</a></li>
<li><a name='toc2' href='#sect2'>Description</a></li>
-<li><a name='toc3' href='#sect3'>Signals</a></li>
-<li><a name='toc4' href='#sect4'>See Also</a></li>
-<li><a name='toc5' href='#sect5'>Author</a></li>
+<li><a name='toc3' href='#sect3'>Options</a></li>
+<li><a name='toc4' href='#sect4'>Signals</a></li>
+<li><a name='toc5' href='#sect5'>See Also</a></li>
+<li><a name='toc6' href='#sect6'>Author</a></li>
</ul>
</body>
</html>
diff --git a/man/runsvdir.8 b/man/runsvdir.8
@@ -3,6 +3,7 @@
runsvdir \- starts and monitors a collection of runsv(8) processes
.SH SYNOPSIS
.B runsvdir
+[\-P]
.I dir
[
.I log
@@ -27,12 +28,12 @@ must be in
.BR runsvdir 's
PATH.
.P
-At least every five seconds,
+At least every five seconds
.B runsvdir
-checks if
+checks whether the services directory
.I dir
has changed.
-If it sees a new subdirectory in services directory
+If it sees a new subdirectory in
.IR dir ,
it starts a new
.BR runsv (8)
@@ -66,12 +67,14 @@ To see the most recent error messages, use a process-listing tool such as
.B runsvdir
writes a dot to the readproctitle log every 15 minutes so that old error
messages expire.
-.P
-Normally
-.B runsvdir
-is started by
-.BR runit (8)
-in stage 2.
+.SH OPTIONS
+.TP
+.B \-P
+use
+.BR setsid (2)
+to run each
+.BR runsv (8)
+process in a new session and separate process group.
.SH SIGNALS
If
.B runsvdir
@@ -93,7 +96,8 @@ chpst(8),
svlogd(8),
utmpset(8),
svwaitdown(8),
-svwaitup(8)
+svwaitup(8),
+setsid(2)
.P
http://smarden.org/runit/
.SH AUTHOR
diff --git a/package/CHANGES b/package/CHANGES
@@ -1,15 +1,18 @@
runit 1.0.5
Mon, 20 Sep 2004 20:12:14 +0000
* svlogd.c: fix line buffer handling for pattern matching (thx Enrico
- Scholz); minor bug fixes.
+ Scholz); properly retry writing to current on error; minor.
* doc/index.html: wording; add link to useinit.html; remove link to runit
- on LinuxFromScratch.
+ on linuxfromscratch.
* doc/runscripts.html: add hint, some getties need to be run in a new
session/process group (thx Dan Melomedman).
* man/svlogd.8: minor fixes.
* man/svwaitdown.8: remove hint about -x option.
* package/check, package/compile, package/install, package/install-man,
package/upgrade: use set -e instead of #!/bin/sh -e.
+ * runsvdir.c: new option -P, run each runsv process in a new session and
+ process group (thx Charlie Brady).
+ * man/runsvdir.8: adapt; typo.
runit 1.0.4
Sun, 01 Aug 2004 18:29:36 +0000
diff --git a/src/runsvdir.c b/src/runsvdir.c
@@ -16,7 +16,7 @@
#include "sig.h"
#include "ndelay.h"
-#define USAGE " dir"
+#define USAGE " [-P] dir"
#define VERSION "$Id$"
#define MAXSERVICES 1000
@@ -39,6 +39,7 @@ int logpipe[2];
iopause_fd io[1];
struct taia stamplog;
int exitsoon =0;
+int pgrp =0;
void usage () { strerr_die4x(1, "usage: ", progname, USAGE, "\n"); }
void fatal(char *m1, char *m2) {
@@ -72,6 +73,7 @@ void runsv(int no, char *name) {
warn("unable to set filedescriptor for log service", 0);
sig_uncatch(sig_hangup);
sig_uncatch(sig_term);
+ if (pgrp) setsid();
pathexec_run(*prog, prog, (const char* const*)environ);
fatal("unable to start runsv ", name);
}
@@ -174,6 +176,13 @@ int main(int argc, char **argv) {
progname =*argv++;
if (! argv || ! *argv) usage();
+ if (**argv == '-') {
+ switch (*(*argv +1)) {
+ case 'P': pgrp =1;
+ case '-': ++argv;
+ }
+ if (! argv || ! *argv) usage();
+ }
sig_catch(sig_term, s_term);
sig_catch(sig_hangup, s_hangup);