A cron job scheduler for Go
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.



Build Status

ticktock is a cron job scheduler that allows you to define and run periodic jobs written in Golang. ticktock also optionally provides automatic job retry if the job has failed with an error. ticktock supports delayed and repeating jobs.

Note: Work in progress, don't use it on prod yet.

// Schedule a job to email reminders once in every 3mins 10 secs.
ticktock.Schedule("email-reminders", job, &t.When{Each: "3m10s"})


Import and go get the ticktock package.

import "github.com/rakyll/ticktock"

The jobs you would like to schedule needs to implement ticktock.Job interface by providing runnable. The following example is a sample job that prints the given message.

type PrintJob struct {
  Msg string

func (j *PrintJob) Run() error {
  return nil

Scheduling repeated jobs

Once you've defined a Job, you need to schedule an instance of the defined job and start the scheduler. Each registered job should have a unique name, otherwise an error will be returned.

// Prints "Hello world" once in every seconds
err := ticktock.Schedule(
    &PrintJob{Msg: "Hello world"},
    &t.When{Every: t.Every(1).Seconds()})

If the scheduler has been started before, the job will be managed to run automatically. Otherwise, it will wait for the scheduler to be started. The scheduler can be started with the following line.

// typically, you schedule all jobs here and start the scheduler

Scheduling delayed jobs

Not all of the scheduled jobs need to run every once a while. You can also schedule a job to run at a time for only once. "Hello world" will be printed once on the next Sunday at 12:00.

  "print-hello-once", &PrintJob{Msg: "Hello world"}, &t.When{Day: t.Sun, At: "12:00"})

Automatic retrys

Scheduler provides automatic retry on jobs failures. In order to configure a retry count, schedule the job with additional options, providing a retry count. In the following case, we schedule the print job to be retried 2 times if it fails. (In this sample case, the job will never be retried, because Run always returns nil though.)

// Prints "Hello hi" once in every week, on Saturday at 10:00
    &PrintJob{Msg: "Hello hi"},
    &t.Opts{RetryCount: 2, When: &t.When{Every: &t.Every(1).Weeks(), Day: t.Sat, At: "10:00"}})

Cancelling jobs

Use the unique name to cancel the job. If the job is currently running, scheduler will wait for it to be completed and cancel the future runs.

// print-hi job will not run again


This section provides some valid interval samples.

// Every 2 minutes
t.When{Each: "2m"}

// Every 100 milliseconds
t.When{Every: t.Every(100).Milliseconds()}

// Every hour at :30
t.When{Every: t.Every(1).Hours(), At: "**:30"}

// Every day at the next beginning of an hour **:00
t.When{Every: t.Every(1).Days(), At: "**:00"}

// Every 2 weeks on Saturdays at 10:00
t.When{Every: &t.Every(2).Weeks(), On: t.Sat, At: "10:00"}

// Saturday at 15:00, not repeated
t.When{Day: t.Sat, At: "15:00"}

// Every week on Sun at 11:00, last run was explicitly given.
// If your process shuts down at 10:00 on Sunday, it allows scheduler
// to schedule the job to run in a hour on an immediate restart.
t.When{LastRun: lastRun, Every: &t.Every(1).Weeks(), On: t.Sun, At: "10:00"}


Copyright 2014 Google Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at


Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Analytics