From nobody Thu Aug 13 14:22:18 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hLSHH2R2dz6nlK8 for ; Thu, 13 Aug 2026 14:22:19 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hLSHG6mJCz469W for ; Thu, 13 Aug 2026 14:22:18 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786630939; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=a8FXPP11FJWAG/aq1EWng/V42Q0fWeoaR0PzS6hD2ac=; b=orA3f/GEbh20RX/hJB9q/QrSMDXqnuHgccShqQX4PGqvHSdo9UeFvojNTKdGQo6q8QmfHw BnFi9cTsCU59Xkr+Ksqgp858+VATLPh2jGBiAgvn3S+DgLJyQv0B73mJm1hN/8/xMUG8wa 9ooJZp/nD5i+Xxor+B6tTyrhxSQNtBjUnXVJknM/DrAsZEjVhWzV6vtxpEpPeoHJ3my2lQ 2d6xMG7zGkJFFv846QlBwPPiBb32rw3QuIBjpiPlECyRnHZwe3Y44teUZg/f+an47WwmJM m2MriAFrViCv27s6AO3M/Sk9J5yqV7VJY7sqTIKo+6HdupG7dkqjwJQ+XDIptA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1786630939; a=rsa-sha256; cv=none; b=Gi9R2mrTcbY0HeSwTtZK/Nj66RajXS8d1tIbMl8+ns6123qlGm0w3HQl+9vnA5F5oKJUy5 hYhxb42FWcoQA1Or1d8z21Yjct/jTQK73gw6rPVm3W071RAKpKZKemFrbZUHeAbcB8NbYv SFYHaIAHcME/TqAjNS1xf8xNoxLvJJs5QZPhL8s2WYupq39+eezlK1B+NteRpqcUbS6bwE wEeRGjTiB3VcUrig+87hbTGXZHMX7y06YT3Y4B2QqG27YmP1zIcpLXVou//pkDpWRkyhdS kLz+OwvrIZBZ04R5xL53EvwcACp7EvWsyrXIhuAECbXS0BynkxY4cm5O1YryIg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786630939; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=a8FXPP11FJWAG/aq1EWng/V42Q0fWeoaR0PzS6hD2ac=; b=CkGevBfZLNA7nKPipWSz7KGCXoabZdQeMyOXAtumtL1gghQ+p3gxMu+1WXMAB4kj/qBIqK /qYifWPYghZWk+XTZA02122xEXIW1QwGfMjD3opHyZlFRaCbgqaFwm6b+evmFeXXyBXOx+ xRhZ1eyWPrxbeiUmqelD080AzqKX91tv3FTrqSGoUTJo0izl/g0tEEQ9yCZwV0kM2ALhTo XIl/NlC9M6EQXcczdd8vjlUk7eYtbp1O1wL+T7i2wPDuuEuMnFOX+N9oto+RnMNR0ctQ54 XNrWTnGhjtMMefMuxUAOjRS2ff7Kk9mfq8etOw1tiZXSfjVykc/bNBROTM3iMQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hLSHG5h0kzSx for ; Thu, 13 Aug 2026 14:22:18 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3a528 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 13 Aug 2026 14:22:18 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Andre Albsmeier From: Michael Osipov Subject: git: fe06e383cc64 - main - daemon(8): Add option to write pidfile w/o supervising it List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: michaelo X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: fe06e383cc64fce8b604d21f8526b91fa6aecc39 Auto-Submitted: auto-generated Date: Thu, 13 Aug 2026 14:22:18 +0000 Message-Id: <6a7dd31a.3a528.107552bb@gitrepo.freebsd.org> The branch main has been updated by michaelo: URL: https://cgit.FreeBSD.org/src/commit/?id=fe06e383cc64fce8b604d21f8526b91fa6aecc39 commit fe06e383cc64fce8b604d21f8526b91fa6aecc39 Author: Andre Albsmeier AuthorDate: 2024-08-17 09:20:00 +0000 Commit: Michael Osipov CommitDate: 2026-08-13 14:21:52 +0000 daemon(8): Add option to write pidfile w/o supervising it Co-authored-by: Michael Osipov PR: 280487 Reviewed by: kevans, michaelo MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D46313 --- 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 Append output of the child process to file\n" " --output-file-mode -M Output file mode of the child process\n" " --output-mask -m 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]; }