Add reset interval after which restart interval is reset
This commit is contained in:
parent
a2c5773b03
commit
497cafbf0f
16
catsitd.8
16
catsitd.8
@ -1,4 +1,4 @@
|
|||||||
.Dd August 13, 2020
|
.Dd August 15, 2020
|
||||||
.Dt CATSITD 8
|
.Dt CATSITD 8
|
||||||
.Os
|
.Os
|
||||||
.
|
.
|
||||||
@ -14,8 +14,9 @@
|
|||||||
.Op Fl f Ar config
|
.Op Fl f Ar config
|
||||||
.Op Fl g Ar group
|
.Op Fl g Ar group
|
||||||
.Op Fl p Ar pidfile
|
.Op Fl p Ar pidfile
|
||||||
|
.Op Fl r Ar reset
|
||||||
.Op Fl s Ar stopexits
|
.Op Fl s Ar stopexits
|
||||||
.Op Fl t Ar interval
|
.Op Fl t Ar restart
|
||||||
.Op Fl u Ar user
|
.Op Fl u Ar user
|
||||||
.
|
.
|
||||||
.Sh DESCRIPTION
|
.Sh DESCRIPTION
|
||||||
@ -100,6 +101,13 @@ Write the PID of the
|
|||||||
process to
|
process to
|
||||||
.Ar pidfile .
|
.Ar pidfile .
|
||||||
.
|
.
|
||||||
|
.It Fl r Ar reset
|
||||||
|
Set the interval in milliseconds
|
||||||
|
for which a process must live
|
||||||
|
to have its service restart interval
|
||||||
|
reset to the initial value.
|
||||||
|
The default interval is 15 minutes.
|
||||||
|
.
|
||||||
.It Fl s Ar stopexits
|
.It Fl s Ar stopexits
|
||||||
Set the list of exit statuses
|
Set the list of exit statuses
|
||||||
for which a restart will not be attempted.
|
for which a restart will not be attempted.
|
||||||
@ -118,10 +126,10 @@ defined in
|
|||||||
The exit status 127
|
The exit status 127
|
||||||
is always treated as a stop exit.
|
is always treated as a stop exit.
|
||||||
.
|
.
|
||||||
.It Fl t Ar interval
|
.It Fl t Ar restart
|
||||||
Set the initial interval between restarts
|
Set the initial interval between restarts
|
||||||
in milliseconds.
|
in milliseconds.
|
||||||
The default interval is 1000.
|
The default interval is 1 second.
|
||||||
.
|
.
|
||||||
.It Fl u Ar user
|
.It Fl u Ar user
|
||||||
Change user to
|
Change user to
|
||||||
|
14
daemon.c
14
daemon.c
@ -48,8 +48,9 @@
|
|||||||
|
|
||||||
#define WS " \t"
|
#define WS " \t"
|
||||||
|
|
||||||
struct timespec restartInterval = { .tv_sec = 1 };
|
|
||||||
struct Set256 stopExits;
|
struct Set256 stopExits;
|
||||||
|
struct timespec restartInterval = { .tv_sec = 1 };
|
||||||
|
struct timespec resetInterval = { .tv_sec = 15 * 60 };
|
||||||
|
|
||||||
static volatile sig_atomic_t signals[NSIG];
|
static volatile sig_atomic_t signals[NSIG];
|
||||||
static void signalHandler(int signal) {
|
static void signalHandler(int signal) {
|
||||||
@ -176,10 +177,10 @@ static void parseExits(char *list) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parseInterval(const char *millis) {
|
static void parseInterval(struct timespec *interval, const char *millis) {
|
||||||
unsigned long ms = strtoul(millis, NULL, 10);
|
unsigned long ms = strtoul(millis, NULL, 10);
|
||||||
restartInterval.tv_sec = ms / 1000;
|
interval->tv_sec = ms / 1000;
|
||||||
restartInterval.tv_nsec = 1000000 * (ms % 1000);
|
interval->tv_nsec = 1000000 * (ms % 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setTitle(void) {
|
static void setTitle(void) {
|
||||||
@ -208,7 +209,7 @@ int main(int argc, char *argv[]) {
|
|||||||
const char *userName = NULL;
|
const char *userName = NULL;
|
||||||
const char *groupName = NULL;
|
const char *groupName = NULL;
|
||||||
|
|
||||||
for (int opt; 0 < (opt = getopt(argc, argv, "C:c:df:g:p:s:t:u:"));) {
|
for (int opt; 0 < (opt = getopt(argc, argv, "C:c:df:g:p:r:s:t:u:"));) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
break; case 'C': serviceDir = optarg;
|
break; case 'C': serviceDir = optarg;
|
||||||
break; case 'c': fifoPath = optarg;
|
break; case 'c': fifoPath = optarg;
|
||||||
@ -216,8 +217,9 @@ int main(int argc, char *argv[]) {
|
|||||||
break; case 'f': configPath = optarg;
|
break; case 'f': configPath = optarg;
|
||||||
break; case 'g': groupName = optarg;
|
break; case 'g': groupName = optarg;
|
||||||
break; case 'p': pidPath = optarg;
|
break; case 'p': pidPath = optarg;
|
||||||
|
break; case 'r': parseInterval(&resetInterval, optarg);
|
||||||
break; case 's': parseExits(optarg);
|
break; case 's': parseExits(optarg);
|
||||||
break; case 't': parseInterval(optarg);
|
break; case 't': parseInterval(&restartInterval, optarg);
|
||||||
break; case 'u': userName = optarg;
|
break; case 'u': userName = optarg;
|
||||||
break; default: return EX_USAGE;
|
break; default: return EX_USAGE;
|
||||||
}
|
}
|
||||||
|
2
daemon.h
2
daemon.h
@ -119,6 +119,7 @@ struct Service {
|
|||||||
int errPipe[2];
|
int errPipe[2];
|
||||||
struct Line outLine;
|
struct Line outLine;
|
||||||
struct Line errLine;
|
struct Line errLine;
|
||||||
|
struct timespec startTime;
|
||||||
struct timespec restartInterval;
|
struct timespec restartInterval;
|
||||||
struct timespec restartDeadline;
|
struct timespec restartDeadline;
|
||||||
};
|
};
|
||||||
@ -156,3 +157,4 @@ static inline uint32_t setTest(const struct Set256 *set, byte x) {
|
|||||||
enum { StopExit = 127 };
|
enum { StopExit = 127 };
|
||||||
extern struct Set256 stopExits;
|
extern struct Set256 stopExits;
|
||||||
extern struct timespec restartInterval;
|
extern struct timespec restartInterval;
|
||||||
|
extern struct timespec resetInterval;
|
||||||
|
10
service.c
10
service.c
@ -163,8 +163,9 @@ void serviceStart(struct Service *service) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (service->pid) {
|
if (service->pid) {
|
||||||
syslog(LOG_NOTICE, "%s[%d] started", service->name, service->pid);
|
|
||||||
service->state = Start;
|
service->state = Start;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &service->startTime);
|
||||||
|
syslog(LOG_NOTICE, "%s[%d] started", service->name, service->pid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,7 +283,12 @@ void serviceReap(pid_t pid, int status) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (service->intent == Start) {
|
if (service->intent == Start) {
|
||||||
// TODO: Determine if restart interval should be reset?
|
struct timespec uptime;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &uptime);
|
||||||
|
timespecsub(&uptime, &service->startTime, &uptime);
|
||||||
|
if (timespeccmp(&uptime, &resetInterval, >=)) {
|
||||||
|
service->restartInterval = restartInterval;
|
||||||
|
}
|
||||||
setDeadline(service);
|
setDeadline(service);
|
||||||
syslog(
|
syslog(
|
||||||
LOG_NOTICE, "%s[%d] restarting in %lds",
|
LOG_NOTICE, "%s[%d] restarting in %lds",
|
||||||
|
Loading…
Reference in New Issue
Block a user