A cron-like scheduler with sane DSL
(job "Say 'Hi' all the time" every 5.seconds (print "Hi")) (job "Compose and send monthly report" every 1.month (send-report (compose-monthly-report)))
If you want to see it with your eyes, make sure to load the following code:
(defun write-to-file (msg file) (with-open-file (log file :direction :output :if-exists :append :if-does-not-exist :create) (format log "~A~%" msg))) (job "Print farbe" every 3.seconds (write-to-file "Farbe" "log.txt")) (job "Print colour" every 2.seconds (write-to-file "Colour" "log.txt")) (job "Print @@@@ 1 min @@@@@" every 1.minute (write-to-file "@@@@@@ 1 min @@@@@@" "log.txt"))
log.txt should give you something like this:
Colour Farbe Colour Colour Farbe Colour Farbe Colour Colour Farbe Colour /one minute later.../ @@@@@@ 1 min @@@@@@ /etc.../
The original idea was for users to use the library to execute some sort of execution of a configuration file. However you can use the job creation process programatically with the underlying function
(defparameter *query-interval* 5) (job-fn (format nil "Query the API every ~A seconds" *query-interval*) 'every `(,*query-interval* seconds) #'query-api-fn)
As you can see, you have to provide a function (either anonimous function or a function symbol) as the last argument.
Instalation and usage
Clone the repo inside
quicklisp/local-projects and do
(ql:quicklisp :clerk) in your REPL.
Make sure your jobs are loaded before executing
(clerk:start). The jobs reside inside
clerk:*jobs*, but you can also type
(clerk:calendar) to see a list of all scheduled and running jobs.
There are two types of jobs -
one-time. If a job has the keyword
every after the job description - the job will be countinuous. This means that when an event is fired, a new event will be pushed in the event queue for firing exactly
interval time from now. The jobs above are an example for
one-time job is fired once and then it is removed from the jobs' queue. An example for a one-time job can be:
(job "Extraordinary event" in 5.days (send-mail "Don't forget X"))
You can use any word instead of
Right now (more are coming soon) there are 2 type of intervals:
- Numbered intervals
where the number is a positive integer and the
interval-type if one of the following:
year. Also you can use the plural form of all these words. For example
2.seconds are both valid.
- Days of the week
(job "Weekly report" every monday (create-report))
Pretty self-explanatory. The idea is that if you type the day of the week, clerk will calculate when it is and add an event to the queue.
Issues / Contribution
If you have issues - open a github issue or contact me at
(reverse "moc.liamg@vokist"). If you want to contribute - open an issue or make a PR. Thanks!