Skip to content

Latest commit

 

History

History
115 lines (83 loc) · 2.87 KB

0087-cl-cron.org

File metadata and controls

115 lines (83 loc) · 2.87 KB

cl-cron

This is a small system which allows you to organize a scheduled function execution in a Cron-like manner.

POFTHEDAY> (cl-cron:make-cron-job
            (lambda ()
              (format t "[~A] Cron works!~%"
                      (local-time:now))))
#:|cron743|

POFTHEDAY> (cl-cron:start-cron)
#<SB-THREAD:THREAD "Anonymous thread" RUNNING {1004D8CB93}>

[2020-06-02T22:29:00.328017+03:00] Cron works!
[2020-06-02T22:30:00.321083+03:00] Cron works!

POFTHEDAY> (cl-cron:stop-cron)
NIL

POFTHEDAY> (defun list-cron-jobs ()
             (loop for key being the hash-key
                     of cl-cron::*cron-jobs-hash*
                   collect key))

POFTHEDAY> (list-cron-jobs)
(#:|cron743|)

POFTHEDAY> (cl-cron:delete-cron-job (first *))
T

POFTHEDAY> (list-cron-jobs)
NIL

Having unnamed cron jobs is not convenient because it is to remove them, you need to get its name using list-cron-jobs function.

But you can provide a hash-key argument to the make-cron-job function:

POFTHEDAY> (cl-cron:make-cron-job
            (lambda ()
              (format t "[~A] Cron works!~%"
                      (local-time:now)))
            :hash-key :print-every-minute)
:PRINT-EVERY-MINUTE

POFTHEDAY> (list-cron-jobs)
(:PRINT-EVERY-MINUTE)

POFTHEDAY> (cl-cron:delete-cron-job
            :print-every-minute)
T

POFTHEDAY> (list-cron-jobs)
NIL

To make a task which runs not every minute but at the specified time, you can pass keyword arguments to the make-cron-job.

For example, this will add a callback to run at 10:00 of every Sunday:

POFTHEDAY> (cl-cron:make-cron-job
            (lambda ()
              (format t "Wake Up!~%"))

            ;; Days of week are numbered from 0,
            ;; where 0 is Monday.
            ;; Run every Sunday:
            :day-of-week 6
            :hour 10
            :minute 0
            :hash-key :sunday-alarm)
:SUNDAY-ALARM

I use cl-cron in the Ultralisp.org, to schedule different tasks. And another useful trick I do is redefining cl-cron:log-cron-message.

By default it writes lines to the ./cron.log, but using this definition you can redirect all messages to the log4cl:

;; Here we are patching this function because
;; original tries to write into a file cl-cron.log
(defun cl-cron:log-cron-message (message &optional (type "error"))
  (if (string-equal type "error")
      (log:error message)
      (log:info message)))

Probably, I’ll make a pull-request with these fixes soon. But seems the author of this library is not very active neither at BitBucket nor at the GitHub.