Date: Mon, 12 Feb 2001 18:00:15 -0600 From: Lucas Bergman <lucas@slb.to> To: Doug Young <dougy@bryden.apana.org.au> Cc: freebsd-questions@freebsd.org Subject: Re: Scripting issue - pppd Message-ID: <20010212180015.A16376@billygoat.slb.to> In-Reply-To: <02a601c09432$54a5c6c0$847e03cb@apana.org.au>; from dougy@bryden.apana.org.au on Sun, Feb 11, 2001 at 11:55:40PM %2B1000 References: <02a601c09432$54a5c6c0$847e03cb@apana.org.au>
next in thread | previous in thread | raw e-mail | index | archive | help
> I need to setup a script to disconnect dialin (pppd) users after > they have been online for more than 8 hours in any one 24 hour > period but haven't a clue where to start. Finding out how long a process has been running from the shell is the hard part of this task. The following C program will tell you how long (in seconds) a process has been running. For example, if I do % gcc -Wall -O -o howlong howlong.c % ./howlong 1 2592578 I get that `init' has been running 2.59 million seconds, or just a smidge over 30 days. This makes sense, since % uptime 5:57PM up 30 days, 6 mins, 1 user, load averages: 0.07, 0.02, 0.00 Note that this program is FreeBSD-specific, since it uses /proc in an essential way. The rest of your problem should be easy, if not trivial, shell scripting; good luck. Lucas -------------- begin howlong.c -------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> void usage(); int main(int argc, char **av) { unsigned long pid, start; char *end; char procdir[80]; /* never overflows, if av[1] is valid */ char starttime[20]; /* never overflows */ FILE *f; int c, field, i = 0; if (argc != 2) { usage(); exit(1); } pid = strtoul(av[1], &end, 10); if (*end) { usage(); exit(1); } strcpy(procdir, "/proc/"); strcat(procdir, av[1]); if (chdir(procdir) == -1) { fprintf(stderr, "howlong: fatal: could not change to %s\n", procdir); fprintf(stderr, "Probably, the process ID %s is not running.\n", av[1]); exit(2); } f = fopen("status", "r"); if (!f) { fprintf(stderr, "howlong: panic: could not open %s/status\n", procdir); exit(3); } field = 1; while (field < 8 && (c = fgetc(f)) >= 0) if ((char) c == ' ') ++field; if (c == EOF) { fclose(f); fprintf(stderr, "howlong: panic: could not get time field from status\n"); exit(4); } while ((c = fgetc(f)) >= 0 && ((char) c != ',')) { if (i > 18) { /* we would overflow starttime */ fclose(f); fprintf(stderr, "howlong: panic: bad start time in status\n"); exit(5); } starttime[i++] = (char) c; } fclose(f); starttime[i] = 0; start = strtoul(starttime, &end, 10); if (*end) { fprintf(stderr, "howlong: panic: bad start time in status\n"); exit(6); } printf("%ld\n", time(0) - start); return 0; } void usage() { fprintf(stderr, "usage: howlong pid\n"); } -------------- end howlong.c ---------------------- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010212180015.A16376>