git: 79f020ffcad2 - stable/15 - daemon(8): Add option to write pidfile w/o supervising it
Michael Osipov <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.cvs.src,gmane.os.freebsd.devel.stable.scm |
|---|---|
| Message-ID | <[email protected]> |
The branch stable/15 has been updated by michaelo: URL: https://cgit.FreeBSD.org/src/commit/?id=79f020ffcad205ef82b0a098fd356dbbc5fba8cd commit 79f020ffcad205ef82b0a098fd356dbbc5fba8cd Author: Andre Albsmeier <[email protected]> AuthorDate: 2024-08-17 09:20:00 +0000 Commit: Michael Osipov <[email protected]> CommitDate: 2026-08-22 21:12:10 +0000 daemon(8): Add option to write pidfile w/o supervising it Co-authored-by: Michael Osipov <[email protected]> PR: 280487 Reviewed by: kevans, michaelo MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D46313 (cherry picked from commit fe06e383cc64fce8b604d21f8526b91fa6aecc39) --- usr.sbin/daemon/daemon.8 | 19 ++++++++++++++++--- usr.sbin/daemon/daemon.c | 27 +++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/usr.sbin/daemon/daemon.8 b/usr.sbin/daemon/daemon.8 index ada1aa252265..8d86f7bac4a7 100644 --- a/usr.sbin/daemon/daemon.8 +++ b/usr.sbin/daemon/daemon.8 @@ -24,7 +24,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd January 28, 2026 +.Dd August 13, 2026 .Dt DAEMON 8 .Os .Sh NAME @@ -32,7 +32,7 @@ .Nd run detached from the controlling terminal .Sh SYNOPSIS .Nm -.Op Fl cfHrS +.Op Fl cfHrSx .Op Fl p Ar child_pidfile .Op Fl P Ar supervisor_pidfile .Op Fl t Ar title @@ -209,10 +209,23 @@ and .Ev SHELL are set accordingly. Requires adequate superuser privileges. +.It Fl x , Fl -execute-only +Do not supervise the child process when using +.Fl p . +This option is useful to run the given program as another user when +.Xr su 1 +can't be used but a file holding the pid is needed. +The +.Ar child_pidfile +will not be locked and the contents may be silently truncated by +a concurrent daemon(8) invocation. .El .Pp If any of the options -.Fl -child-pidfile , +.Fl -child-pidfile +(without +.Fl -execute-only +), .Fl -output-mask , .Fl -restart , .Fl -restart-delay , diff --git a/usr.sbin/daemon/daemon.c b/usr.sbin/daemon/daemon.c index 9158d6404b29..72a05c65592b 100644 --- a/usr.sbin/daemon/daemon.c +++ b/usr.sbin/daemon/daemon.c @@ -119,13 +119,14 @@ static int daemon_setup_kqueue(void); static int pidfile_truncate(struct pidfh *); -static const char shortopts[] = "+cfHSp:P:ru:o:M:s:l:t:m:R:T:C:h"; +static const char shortopts[] = "+cfHSxp:P:ru:o:M:s:l:t:m:R:T:C:h"; static const struct option longopts[] = { { "change-dir", no_argument, NULL, 'c' }, { "close-fds", no_argument, NULL, 'f' }, { "sighup", no_argument, NULL, 'H' }, { "syslog", no_argument, NULL, 'S' }, + { "execute-only", no_argument, NULL, 'x' }, { "output-file", required_argument, NULL, 'o' }, { "output-file-mode", required_argument, NULL, 'M' }, { "output-mask", required_argument, NULL, 'm' }, @@ -147,7 +148,7 @@ static _Noreturn void usage(int exitcode) { (void)fprintf(stderr, - "usage: daemon [-cfHrS] [-p child_pidfile] [-P supervisor_pidfile]\n" + "usage: daemon [-cfHrSx] [-p child_pidfile] [-P supervisor_pidfile]\n" " [-u user] [-o output_file] [-M output_file_mode] [-t title]\n" " [-l syslog_facility] [-s syslog_priority]\n" " [-T syslog_tag] [-m output_mask] [-R restart_delay_secs]\n" @@ -159,6 +160,7 @@ usage(int exitcode) " --close-fds -f Set stdin, stdout, stderr to /dev/null\n" " --sighup -H Close and re-open output file on SIGHUP\n" " --syslog -S Send output to syslog\n" + " --execute-only -x Do not supervise child process when using -p\n" " --output-file -o <file> Append output of the child process to file\n" " --output-file-mode -M <mode> Output file mode of the child process\n" " --output-mask -m <mask> What to send to syslog/file\n" @@ -185,6 +187,7 @@ main(int argc, char *argv[]) int ch = 0; mode_t *set = NULL; struct daemon_state state; + bool opt_x = false; daemon_state_init(&state); @@ -195,7 +198,7 @@ main(int argc, char *argv[]) /* * Supervision mode is enabled if one of the following options are used: * --output-file -o - * --child-pidfile -p + * --child-pidfile -p (if --execute-only -x is not given) * --supervisor-pidfile -P * --restart -r / --restart-delay -R * --syslog -S @@ -262,9 +265,14 @@ main(int argc, char *argv[]) free(set); set = NULL; break; + case 'x': + opt_x = true; + break; case 'p': state.child_pidfile = optarg; - state.mode = MODE_SUPERVISE; + /* + * Enable supervision later if no -x was given + */ break; case 'P': state.parent_pidfile = optarg; @@ -322,6 +330,17 @@ main(int argc, char *argv[]) usage(1); } + /* + * Enable supervision for -p if -x was not given + */ + if (state.child_pidfile != NULL) { + if (!opt_x) { + state.mode = MODE_SUPERVISE; + } + } else if (opt_x) { + errx(6, "-x is not allowed without -p"); + } + if (!state.title) { state.title = argv[0]; }