ron@mlfarm.com (Ronald Florence) (04/18/91)
A friend who takes a mail/news feed from us with an ms-dos system wanted to be able to poll when he was on-the-road. I know next to nothing about ms-dos, don't want to learn about things like TSRs, and Icon is the only language our systems share. This was the quick & dirty solution. The busy-loops are dumb (I anticipate flames), but Icon tables made this fun. I'd urge NOT running this code on a multi-tasking system like Unix, unless you're interested in seeing how high your system load can reach. -- Ronald Florence ron@mlfarm.com #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # cron.icn # This archive created: Thu Apr 18 10:25:34 1991 # By: Ronald Florence (Maple Lawn Farm, Stonington, CT) export PATH; PATH=/bin:/usr/bin:$PATH if test -f 'cron.icn' then echo shar: "will not over-write existing file 'cron.icn'" else cat << \SHAR_EOF > 'cron.icn' ############################################################################ # # Name: cron.icn # # Title: Cron Daemon # # Author: Ronald Florence (ron@mlfarm.com) # # Date: 18 April 1991 # # Version: 1.0 # ############################################################################ # # This program provides a crude cron daemon for ms-dos or other # single-tasking systems. If a scheduled command fails, it is # retried at a specified interval. # # usage: cron [-r] [-c cmd] [-t tries] [-i interval] 0-23 [0-59] # cron < cron-table [ > cron.log ] # # The command-line usage invokes a single command at a specified time. # The -r option runs the daemon continuously. Defaults for the command, # interval, and retries can be specified in the code. The second usage # reads an ascii table in the following format: # # # hour minute interval retries command # 0 15 5 3 uuio | mail postmaster # 1 35 0 0 rnews *.nws # 6 30 2 2 make coffee # # Lines beginning with `#' in the table are treated as comments. # ############################################################################ # # Link: options # Bugs: This busy-loop should NOT be run on multi-tasking systems. # Commands scheduled at conflicting times may not be invoked. # The cron-table is not compatible with Unix cron tables. # ############################################################################ link options procedure main(arg) usage := ["usage: cron [-r] [-c cmd] [-t tries] [-i interval] 0-23 [0-59]", " cron < cron-table"] default_cmd := "uuio" default_interval := 5 default_retries := 3 cmd := table(0) interval := table(0) retries := table(0) if *arg > 0 then { opts := options(arg, "c:i+t+r") h := integer(arg[1]) m := integer(arg[2]) | 0 (/h | h < 0 | h > 23 | m < 0 | m > 59 ) & { every write(!usage); exit(-1) } t := h * 3600 + m * 60 cmd[t] := \opts["c"] | default_cmd interval[t] := \opts["i"] | default_interval retries[t] := \opts["t"] | default_retries } else every s := !&input do s ? { ="#" & next tmp := [] while tab(upto(&digits)) \4 do put(tmp,tab(many(&digits))) t := pop(tmp) * 3600 + pop(tmp) * 60 interval[t] := pop(tmp) retries[t] := pop(tmp) cmd[t] := (tab(many(' \t')), tab(0)) } write(&errout, "time\tint\tret\tcommand") write(&errout, "-------------------------------") every t := key(cmd) do write(&errout, right(t/3600, 2, "0"), ":", left((t % 3600)/60, 2, "0"), "\t", interval[t], "\t", retries[t], "\t", cmd[t]) while t := now() do (t = key(cmd)) & { try := 0 repeat { (system(cmd[t]) = 0) & { write(cmd[t], " completed ", &dateline) while t = now() break } write(cmd[t], " FAILED ", &dateline) ((try +:= 1) >= retries[t]) & break repoll := now() + interval[t] * 60 while repoll > now() } (*arg = 0) | \opts["r"] | exit(try) } end procedure now() time := [] &clock ? while tab(upto(&digits)) do put(time,tab(many(&digits))) return time[1] * 60 * 60 + time[2] * 60 + time[3] end SHAR_EOF if test 3218 -ne "`wc -c < 'cron.icn'`" then echo shar: "error transmitting 'cron.icn'" '(should have been 3218 characters)' fi fi exit 0 # End of shell archive -- Ronald Florence ron@mlfarm.com