#!/local/scsh/bin/scsh \ -e main -s !# ;; From Eric Marsden's downloads ;; a daemon does a chdir() to /, redirects its stdin and stdout from ;; /dev/null, and does a fork() and setsid(). (define (daemonize* thunk) (chdir "/") (close (current-input-port)) (set-current-input-port! (open-input-file "/dev/null")) (close (current-output-port)) (set-current-output-port! (open-output-file "/dev/null")) (if (fork) (exit)) (become-session-leader) (close (error-output-port)) (set-error-output-port! (open-output-file "/dev/null")) (thunk)) (define-syntax daemonize (syntax-rules () ((daemonize body ...) (daemonize* (lambda () body ...))))) (define (display-loads oport loads) (display (format #f "~a ~a ~a\n" (car loads) (cadr loads) (caddr loads)) oport)) (define (server-loop) (bind-listen-accept-loop protocol-family/internet (lambda (sock sock-addr) (with-input-from-file "/proc/loadavg" (lambda () (let ((line (read-string/partial 1024))) (if (string? line) (let ((loads (string-tokenize line))) (if (< (length loads) 5) (display "Load Format Error" (socket:outport sock)) (display-loads (socket:outport sock) loads))) (display "Read Error\n" (socket:outport sock)))))) (force-output (socket:outport sock)) (close-socket sock)) 5000)) (define (main args) (daemonize* server-loop))