/* * RUNMAINT.C - run and maintain N processes, Matthew Dillon * * example: runmaint 10 /usr/lib/sendmail -q */ #include #include #include #include #include #include #include #include #include int main(int ac, char **av) { int n; int s = 10; int i = -1; int r = 0; int ttl = 0; int *pids; char *ptr; if (ac < 3) { printf("runmaint N[:S[:I]] progname progargs...\n"); printf(" N - max number of processes\n"); printf(" S - new process every S seconds (after stabilized)\n"); printf(" I - new process every I seconds (initial startup)\n"); exit(1); } n = strtol(av[1], &ptr, 0); if (*ptr == ':') { s = strtol(ptr + 1, &ptr, 0); if (*ptr == ':') { i = strtol(ptr + 1, &ptr, 0); } } if (i < 0) i = s * 2; pids = calloc(sizeof(int), n); if (fork() > 0) exit(0); { int fd; close(0); close(1); close(2); if ((fd = open("/dev/tty", O_RDWR)) >= 0) { ioctl(fd, TIOCNOTTY, 0); close(fd); } #ifdef sgi setpgrp(); #else setpgrp(0, 0); #endif } for (;;) { if (r < n) { int pid; if ((pid = fork()) == 0) { execv(av[2], av + 2); exit(0); } if (pid > 0) { pids[r++] = pid; ++ttl; } } { int pid; while ((pid = wait3(NULL, WNOHANG, NULL)) > 0) { int i; for (i = 0; i < r; ++i) { if (pids[i] == pid) { pids[i] = pids[--r]; break; } } } } if (ttl < n) /* initial starts */ sleep(i); else /* after stabilized */ sleep(s); } return(0); }