From nobody Wed May 22 07:45:50 2024 X-Original-To: dev-commits-src-main@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 4Vkjz30VVcz5L88K; Wed, 22 May 2024 07:45:51 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Vkjz303ZYz4bmL; Wed, 22 May 2024 07:45:51 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1716363951; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=MjIW6zOIGl/Y5HG7RH+pHPNXPwA292ovP4mDinNDFwE=; b=H0waCKkYtE8iDlwsfxCRAnOKjrmYq9HFDF3pF3KWDwR+j4fGuxWGmRY9ObEfPgaRy053BT wA6d5lPTtN8hZpnoK+c7HGVNTCgkxhjwudi22o8Lv2RV+k21XwPvLhc6dYxOP9CGmR1bHo MgpBjgMq4Q1O1NufTFR4PP4w57+aOVbgDpXWXSE9xF6Yo+6rtc5h3Cj9EEPQPQuM3crVac DNUr9Z1mqAUDwfzKCTZk+qyHEG+fO8lM4U+wIUnwzbTWZtzcqaJyBbm2RNaPJH1g/oGPem fs219HgEfZsEmMEZzKE6pmKybPkmvHcUciLNu4k2ovb1doUchi3w0jorLZA7uQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1716363951; a=rsa-sha256; cv=none; b=wj3dHb5PNRs4cWXMVSY2wkq3OL+tYfxD/Rsi/8vZ1HaWeeMcasT0L7yMqoAi7K7Ma/2lQS NOP7opJFwL/pnuMmiRevqNYiuPJQ8LXzKMiIm8Ln1a7eBv2FMTY06sbta6mSTiwSSS9Qqt XXpMb1KfHBbjonyb2N1zMjchIXRU4iN8K57lopvB3w71IbS6kIoehJaz5QyzaOpPMJquYd /VvOELJ0dky+dG03AlCwstsEeLgrJ3UM4io4bahwKi5l2WUGY4MrQy9oHI+bo1rwm5E1TH uBwRYTy6pMe1orLJh4ohdAEu81bLxgAQq29FAOl5FrJQpZiHOPjuZXHAj71oFg== 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=1716363951; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=MjIW6zOIGl/Y5HG7RH+pHPNXPwA292ovP4mDinNDFwE=; b=hfnG0ztOfB6Cr0roA3yTOklIVcn6unvV07XRgEO4GEfhu813sArixegOWfdu0HxgNHmkmn FWgkucYkJTS0sttTvVH9bacpuSp5nFS5bprn8EyNmgrcLaBFEW0LHYwcE4k0xhjtjnW2Tu Fp5W958ymBEGn+Q8ULwD+BcRjT0rfmhbOPqYe2/ho8/D2fnI88QmPMdOSpbgN1zKqtal00 hGRXfISLHZkyY4zsyiRTT+fXg3I8EG6vo3+0ZNY6cwW1xHouOULsmvbVr0U3G8q3MHeTzj uB1vwtH8UDMJtpWhYdrwnjsp+tFQy/waVGSPASizJSzhuqpQkJ460th2ahqxUA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Vkjz26SqPzxBf; Wed, 22 May 2024 07:45:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 44M7jofD026253; Wed, 22 May 2024 07:45:50 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 44M7josw026250; Wed, 22 May 2024 07:45:50 GMT (envelope-from git) Date: Wed, 22 May 2024 07:45:50 GMT Message-Id: <202405220745.44M7josw026250@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Juraj Lutter Subject: git: 7618c9e1637c - main - daemon: Add -C (--restart-count) option List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: otis X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 7618c9e1637caea97723ff8accd60f3dc436b044 Auto-Submitted: auto-generated The branch main has been updated by otis: URL: https://cgit.FreeBSD.org/src/commit/?id=7618c9e1637caea97723ff8accd60f3dc436b044 commit 7618c9e1637caea97723ff8accd60f3dc436b044 Author: Juraj Lutter AuthorDate: 2024-04-25 13:40:00 +0000 Commit: Juraj Lutter CommitDate: 2024-05-22 07:45:23 +0000 daemon: Add -C (--restart-count) option Add a new option (-C, --restart-count) to specify the maximum number of times that the controlled process is restarted if restart (-r) is restarted. Reviewed by: kevans Differential Revision: https://reviews.freebsd.org/D44944 --- usr.sbin/daemon/daemon.8 | 19 ++++++++++++++++--- usr.sbin/daemon/daemon.c | 25 ++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/usr.sbin/daemon/daemon.8 b/usr.sbin/daemon/daemon.8 index 4fafb8528f18..52fbc230ac77 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 December 27, 2023 +.Dd April 25, 2024 .Dt DAEMON 8 .Os .Sh NAME @@ -43,6 +43,7 @@ .Op Fl T Ar syslog_tag .Op Fl l Ar syslog_facility .Op Fl R Ar restart_delay_seconds +.Op Fl C Ar restart_count .Ar command arguments ... .Sh DESCRIPTION The @@ -55,6 +56,17 @@ log file. .Pp The options are as follows: .Bl -tag -width indent +.It Fl C , Fl -restart-count Ar restart_count +Restart the process at most +.Ar restart_count +times. +When zero is specified, +.Nm +will exit. +The maximum restart count is +.Cm 128 . +This option is used together with option +.Fl -restart . .It Fl c , Fl -change-dir Change the current working directory to the root .Pq Dq Pa / . @@ -72,8 +84,9 @@ Close and re-open it when signal .Dv SIGHUP is received, for interoperability with -.Xr newsyslog 1 -and similar log rotation / archival mechanisms. If +.Xr newsyslog 8 +and similar log rotation / archival mechanisms. +If .Fl -output-file is not specified, this flag is ignored. .It Fl l , Fl -syslog-facility Ar syslog_facility diff --git a/usr.sbin/daemon/daemon.c b/usr.sbin/daemon/daemon.c index 26e34d1d2e2b..7214faf8bde3 100644 --- a/usr.sbin/daemon/daemon.c +++ b/usr.sbin/daemon/daemon.c @@ -56,6 +56,9 @@ /* 1 year in seconds */ #define MAX_RESTART_DELAY 60*60*24*365 +/* Maximum number of restarts */ +#define MAX_RESTART_COUNT 128 + #define LBUF_SIZE 4096 enum daemon_mode { @@ -92,6 +95,8 @@ struct daemon_state { bool restart_enabled; bool syslog_enabled; bool log_reopen; + int restart_count; + int restarted_count; }; static void restrict_process(const char *); @@ -109,7 +114,7 @@ static void daemon_exec(struct daemon_state *); static bool daemon_is_child_dead(struct daemon_state *); static void daemon_set_child_pipe(struct daemon_state *); -static const char shortopts[] = "+cfHSp:P:ru:o:s:l:t:m:R:T:h"; +static const char shortopts[] = "+cfHSp:P:ru:o:s:l:t:m:R:T:C:h"; static const struct option longopts[] = { { "change-dir", no_argument, NULL, 'c' }, @@ -121,6 +126,7 @@ static const struct option longopts[] = { { "child-pidfile", required_argument, NULL, 'p' }, { "supervisor-pidfile", required_argument, NULL, 'P' }, { "restart", no_argument, NULL, 'r' }, + { "restart-count", required_argument, NULL, 'C' }, { "restart-delay", required_argument, NULL, 'R' }, { "title", required_argument, NULL, 't' }, { "user", required_argument, NULL, 'u' }, @@ -139,6 +145,7 @@ usage(int exitcode) " [-u user] [-o output_file] [-t title]\n" " [-l syslog_facility] [-s syslog_priority]\n" " [-T syslog_tag] [-m output_mask] [-R restart_delay_secs]\n" + " [-C restart_count]\n" "command arguments ...\n"); (void)fprintf(stderr, @@ -152,6 +159,7 @@ usage(int exitcode) " --child-pidfile -p Write PID of the child process to file\n" " --supervisor-pidfile -P Write PID of the supervisor process to file\n" " --restart -r Restart child if it terminates (1 sec delay)\n" + " --restart-count -C Restart child at most N times, then exit\n" " --restart-delay -R Restart child if it terminates after N sec\n" " --title -t Set the title of the supervisor process\n" " --user -u <user> Drop privileges, run as given user\n" @@ -198,6 +206,13 @@ main(int argc, char *argv[]) case 'c': state.keep_cur_workdir = 0; break; + case 'C': + state.restart_count = (int)strtonum(optarg, 0, + MAX_RESTART_COUNT, &e); + if (e != NULL) { + errx(6, "invalid restart count: %s", e); + } + break; case 'f': state.keep_fds_open = 0; break; @@ -331,6 +346,12 @@ main(int argc, char *argv[]) state.mode = MODE_SUPERVISE; daemon_eventloop(&state); daemon_sleep(&state); + if (state.restart_enabled && state.restart_count > -1) { + if (state.restarted_count >= state.restart_count) { + state.restart_enabled = false; + } + state.restarted_count++; + } } while (state.restart_enabled); daemon_terminate(&state); @@ -723,6 +744,8 @@ daemon_state_init(struct daemon_state *state) .keep_fds_open = 1, .output_fd = -1, .output_filename = NULL, + .restart_count = -1, + .restarted_count = 0 }; }