set crontab {{* * * * /15 "set x 1"} {* * * * /2 "set x 2"}} proc event:cron {} { global crontab set time [clock format [clock seconds] -format "%M %H %u %d %m"] proc check {time job} { scan $time "%d %d %d %d %d" t(M) t(H) t(u) t(d) t(m) set p(m) [lindex $job 0];set p(d) [lindex $job 1];set p(u) [lindex $job 2];set p(H) [lindex $job 3];set p(M) [lindex $job 4] set dojob 1 foreach c {m d u H M} { if [string equal * $p($c)] {continue} if [string match /* $p($c)] {scan $p($c) "/%d" pattern; if [expr $t($c)%$pattern]==0 {continue} {set dojob 0; break}} set p($c) [split $p($c) ,] set match 0 foreach pattern $p($c) { if [string match *-* $pattern] { set pattern [split $pattern -] set range ""; for {set x [lindex $pattern 0]} {$x<=[lindex $pattern 1]} {incr x} {lappend range $x} if [lsearch $range $t($c)]>=0 {set match 1; break} } { if $pattern==$t($c) {set match 1; break} } } if $match==1 {continue} set dojob 0; break } if $dojob==1 {logexec [lindex $job 5] 5 "Running cronjob \"[lindex $job 5]\""} } foreach job $crontab {check $time $job} }