1
0
Fork 0
mirror of https://github.com/pygos/init.git synced 2024-11-05 04:07:10 +01:00

Add service respawn limit

Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
This commit is contained in:
David Oberhollenzer 2018-03-26 00:34:00 +02:00
parent 09115f9a97
commit 160ef94e8b
3 changed files with 40 additions and 0 deletions

View file

@ -43,6 +43,16 @@ static void handle_exited(service_t *svc)
break;
}
if (svc->rspwn_limit > 0) {
svc->rspwn_limit -= 1;
if (svc->rspwn_limit == 0) {
print_status(svc->desc, STATUS_FAIL, false);
delsvc(svc);
break;
}
}
svc->pid = runlst(svc->exec, svc->num_exec, svc->ctty);
if (svc->pid == -1) {
print_status(svc->desc, STATUS_FAIL, false);

View file

@ -53,6 +53,8 @@ typedef struct service_t {
size_t num_exec; /* number of command lines */
char *ctty; /* controlling tty or log file */
int rspwn_limit; /* maximum respawn count */
char **before; /* services that must be executed later */
size_t num_before;
char **after; /* services that must be executed first */

View file

@ -23,6 +23,7 @@
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <ctype.h>
#include "service.h"
#include "util.h"
@ -132,6 +133,32 @@ static int svc_target(service_t *svc, char *arg,
return 0;
}
static int svc_rspwn_limit(service_t *svc, char *arg,
const char *filename, size_t lineno)
{
const char *ptr;
svc->rspwn_limit = 0;
if (!isdigit(*arg))
goto fail;
for (ptr = arg; isdigit(*ptr); ++ptr)
svc->rspwn_limit = svc->rspwn_limit * 10 + (*ptr - '0');
if (*ptr != '\0')
goto fail;
free(arg);
return 0;
fail:
fprintf(stderr,
"%s: %zu: expected numeric argument for respawn limit\n",
filename, lineno);
free(arg);
return -1;
}
static const struct {
const char *key;
@ -147,6 +174,7 @@ static const struct {
{ "tty", svc_tty },
{ "before", svc_before },
{ "after", svc_after },
{ "respawn_limit", svc_rspwn_limit },
};