Hi! >>>>> "Garance" == Garance A Drosehn <Garance> writes: Garance> It happens that I do plan to do some work on newsyslog this Garance> week, so I will look into your patch while doing that work. This is updated version of my patch. From newsyslog.conf(5): R indicates that the file specified by path_to_pid_file should be executed when this log file is rotated instead of to send signal. You can use quote symbols to limit command or file name which contain spaces. Here is an example from my newsyslog.conf: /var/log/asterisk/*_log asterisk: 644 5 * $W6D0 JBGR '/usr/local/sbin/asterisk -r -x "logger reload"' /var/log/asterisk/messages asterisk: 644 5 * $W6D0 JR '/usr/local/sbin/asterisk -r -x "logger reload"' diff -Nru usr.sbin/newsyslog.orig/newsyslog.c usr.sbin/newsyslog/newsyslog.c --- usr.sbin/newsyslog.orig/newsyslog.c Thu Jun 22 14:43:00 2006 +++ usr.sbin/newsyslog/newsyslog.c Thu Jun 22 14:41:45 2006 _at__at_ -111,6 +111,8 _at__at_ /* process when trimming this file. */ #define CE_CREATE 0x0100 /* Create the log file if it does not exist. */ #define CE_NODUMP 0x0200 /* Set 'nodump' on newly created log file. */ +#define CE_RUNCMD 0x0400 /* Execute program on rotate instead */ + /* of signal. */ #define MIN_PID 5 /* Don't touch pids lower than this */ #define MAX_PID 99999 /* was lower, see /usr/include/sys/proc.h */ _at__at_ -144,6 +146,7 _at__at_ SLIST_ENTRY(sigwork_entry) sw_nextp; int sw_signum; /* the signal to send */ int sw_pidok; /* true if pid value is valid */ + int sw_runcmd; /* true if we going to run prog. */ pid_t sw_pid; /* the process id from the PID file */ const char *sw_pidtype; /* "daemon" or "process group" */ char sw_fname[1]; /* file the PID was read from */ _at__at_ -1348,6 +1351,9 _at__at_ case 'n': working->flags |= CE_NOSIGNAL; break; + case 'r': + working->flags |= CE_RUNCMD; + break; case 'u': working->flags |= CE_SIGNALGROUP; break; _at__at_ -1375,6 +1381,17 _at__at_ parse = son(parse); if (!*parse) eol = 1; + if (q && *q) { + if (*q == '"' || *q == '\'') { + char *qo; + + qo = strchr(q + 1, (char) *q); + if (qo != NULL) { + parse = qo; + q++; + } + } + } *parse = '\0'; } _at__at_ -1702,7 +1719,7 _at__at_ struct sigwork_entry *nextsig; int kres, secs; - if (!(swork->sw_pidok) || swork->sw_pid == 0) + if (!(swork->sw_pidok) || (swork->sw_pid == 0 && !swork->sw_runcmd)) return; /* no work to do... */ /* _at__at_ -1743,7 +1760,11 _at__at_ return; } - kres = kill(swork->sw_pid, swork->sw_signum); + if (swork->sw_runcmd) + kres = system(swork->sw_fname); + else + kres = kill(swork->sw_pid, swork->sw_signum); + if (kres != 0) { /* * Assume that "no such process" (ESRCH) is something _at__at_ -1754,12 +1775,22 _at__at_ */ if (errno != ESRCH) swork->sw_pidok = 0; - warn("can't notify %s, pid %d", swork->sw_pidtype, - (int)swork->sw_pid); + if (swork->sw_runcmd) + warn("can't notify %s by %s", swork->sw_pidtype, + swork->sw_fname); + else + warn("can't notify %s, pid %d", swork->sw_pidtype, + (int)swork->sw_pid); } else { - if (verbose) - printf("Notified %s pid %d = %s\n", swork->sw_pidtype, - (int)swork->sw_pid, swork->sw_fname); + if (verbose) { + if (swork->sw_runcmd) + printf("Notified %s by %s\n", + swork->sw_pidtype, swork->sw_fname); + else + printf("Notified %s pid %d = %s\n", + swork->sw_pidtype, (int)swork->sw_pid, + swork->sw_fname); + } if (secs > 0) { if (verbose) printf("Pause %d second(s) between signals\n", _at__at_ -1956,6 +1987,12 _at__at_ swork->sw_pidok = 0; swork->sw_pid = 0; swork->sw_pidtype = "daemon"; + swork->sw_runcmd = 0; + if (ent->flags & CE_RUNCMD) { + swork->sw_pidok = swork->sw_runcmd = 1; + return; + } + if (ent->flags & CE_SIGNALGROUP) { /* * If we are expected to signal a process-group when diff -Nru usr.sbin/newsyslog.orig/newsyslog.conf.5 usr.sbin/newsyslog/newsyslog.conf.5 --- usr.sbin/newsyslog.orig/newsyslog.conf.5 Thu Jun 22 14:43:00 2006 +++ usr.sbin/newsyslog/newsyslog.conf.5 Mon Jun 26 12:22:08 2006 _at__at_ -290,6 +290,12 _at__at_ .It Cm N indicates that there is no process which needs to be signaled when this log file is rotated. +.It Cm R +indicates that the file specified by +.Ar path_to_pid_file +should be executed when this log file is rotated instead of to send +signal. You can use quote symbols to limit command or file name which +contain spaces. .It Cm U indicates that the file specified by .Ar path_to_pid_file -- DSS5-RIPE DSS-RIPN 2:550/5068_at_fidonet 2:550/5069_at_fidonet xmpp:dsh_at_vlink.ru mailto:dsh_at_vlink.ru http://neva.vlink.ru/~dsh/Received on Mon Jun 26 2006 - 06:28:37 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:38:57 UTC