Add respawn

This commit is contained in:
sin 2014-04-17 14:00:36 +01:00
parent e8b61e9b7e
commit c4ff95798c
3 changed files with 68 additions and 0 deletions

View File

@ -40,6 +40,7 @@ SRC = \
pidof.c \
pivot_root.c \
ps.c \
respawn.c \
rmmod.c \
stat.c \
su.c \
@ -67,6 +68,7 @@ MAN1 = \
pagesize.1 \
pidof.1 \
ps.1 \
respawn.1 \
stat.1 \
su.1 \
truncate.1 \

12
respawn.1 Normal file
View File

@ -0,0 +1,12 @@
.TH RESPAWN 1 ubase-VERSION
.SH NAME
\fBrespawn\fR - Spawn the given command repeatedly
.SH SYNOPSIS
\fBrespawn\fR [\fB-d\fI N\fR] \fIcmd\fR [\fIargs...\fR]
.SH DESCRIPTION
\fBrespawn\fR spawns the given \fIcmd\fR in a new session
repeatedly.
.SH OPTIONS
.TP
\fB-d\fR
Set the delay between invocations of \fIcmd\fR. It defaults to 0.

54
respawn.c Normal file
View File

@ -0,0 +1,54 @@
/* See LICENSE file for copyright and license details. */
#include <errno.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "util.h"
static void
usage(void)
{
eprintf("usage: respawn [-d N] cmd [args...]\n");
}
int
main(int argc, char **argv)
{
pid_t pid;
int savederrno;
unsigned int delay = 0;
ARGBEGIN {
case 'd':
delay = estrtol(EARGF(usage()), 0);
break;
default:
usage();
} ARGEND;
if(argc < 1)
usage();
while (1) {
pid = fork();
if (pid < 0)
eprintf("fork:");
switch (pid) {
case 0:
if (setsid() < 0)
eprintf("setsid:");
execvp(argv[0], argv);
savederrno = errno;
weprintf("execvp %s:", argv[0]);
_exit(savederrno == ENOENT ? 127 : 126);
break;
default:
waitpid(pid, NULL, 0);
break;
}
sleep(delay);
}
/* not reachable */
return EXIT_SUCCESS;
}