A little demon

Richard Suchenwirth 2002-08-16 - This little script checks periodically for the existence of a file at well-specified location ("todo"), and if it exists,

  • executes it in a sh (hence Unix only, for now)
  • deletes it
  • writes the result to another file ("done")

Very simple, but seems to work also with non-trivial tasks...

proc every {ms body} {eval $body; after $ms [info level 0]}

set filename /home/suchenwi/todo
every 5000 {
    if [file exists $::filename] {
        catch {exec sh $::filename} res
        set fp [open /home/suchenwi/done w]
        puts $fp $res
        close $fp
        file delete $::filename
    }
}

To feed this demon, I only have to type at the shell prompt

  echo "grep fff t" > ~/todo   

and 5 sec or so later, the file ~/done contains the result of this demonery... What that is good for? Well, a colleague wanted to be able to run a program under a different account, without uid/su/rsh. This is the solution I came up with. A few days later, I needed it myself:

Printer demon: Assume a Tk app runs on Windows - its canvas can produce Postscript files, but how to print it (without starting up Ghostview or so, and manual intervention)? This solution requires that you have a directory on a Unix box (where of course just lpr brings Postscript well to paper) which is remotely mounted to your Windows box too. In my case, /home/suchenwi is mounted on Windows as x: Then I just need the following little demon:

 proc every {ms body} {eval $body; after $ms [info level 0]}
cd /home/suchenwi/etc/toprint

every 30000 {
    foreach filename [glob -nocomplain *.ps *.PS] {
    exec lpr $filename
    file delete -force $filename
 }
}
vwait forever

Started on Unix with $ tclsh ~/tcl/printerdemon.tcl &, it hovers in the background, and every half minute checks whether there are files in the well-known directory. On the Windows side, I just need

$canvas postscript -file x:/etc/toprint/[pid].ps

and soon enough, the pages comes out of the printer... To bring in some FIFO queuing, one could use clock seconds in generating the filename, and lsort -integer in the demon.