Easy to Use

Almost as simple as Unix cron or Windows scheduled tasks.

Straightforward as compared to most competitors.

Full-Featured

Local, HTTP and SSH remote execution. Resource management. Clustered targets. Web Console. REST API. Customizable alert engine. And more.

Far more than other free-software schedulers.

Free Software

Deploy on your Linux server at no cost.

You are not bound to a single supplier.

Features Tour

Web Console Screenshots

Desktop App Screenshots

(work in progress)

Download Now !

Linux Tarballs

Windows Packages

Work in progress.

Source Code

You can install qron from the source code.

Or at less have a look on it.

Source code »

User Manual

The user manual is embeded within qron's web console, but it can also be read here on the web site.

User manual »

Getting Started in 5 Minutes

Get the software

Choose a package or (if you dare!) compile it from source code.

Packages » Source code »

Set up a configuration file

You've got to create or modify a file named qron.conf which contain the tasks definition and other parameters.

Pick one of the examples below:

Simple local task example

(config
 (taskgroup app1.jobs
  (label scheduled jobs for app1)
 )
 (task backup # daily backup job sample
  (taskgroup app1.jobs)
  (label daily backup)
  (mean exec)
  (command /opt/app1/scripts/backup.sh)
  (trigger(cron 0 0 23 * * *)) # like cron, with seconds
 )
)

HTTP polling example

(config
 (taskgroup app1.light
  (label lightweight tasks for app1)
 )
 (task poll1
  (taskgroup app1.light)
  (label triggering some lightweight task through http polling)
  (mean http)
  (command /foo/)
  (param method POST)
  (target localhost)
  (trigger
   (cron /30 * * * * *) # every 30 seconds
  )
 )
 (host(id localhost)(hostname localhost))
)

SSH hourly batch example, with cluster and resources

(config
 (taskgroup app1.jobs
  (label scheduled jobs for app1)
 )
 (task import # hourly data import sample
  (taskgroup app1.jobs)
  (label udpate data from database)
  (mean ssh)
  (command "/opt/app1/scripts/import.sh %DATE")
  (param DATE "%{=date!yyyy-MM-dd}") # set param, using date auto params
  (target back-servers) # run on any back server
  (resource(id memory)(quantity 512)) # consume 512 resource, e.g. 512 MB
  (trigger(cron 0 /2 8-20 * * *)) # every 2 hours from 8am to 8pm
  (maxexpectedduration 3600) # raise an alert after 1 hour running time
 )
 (host back1
  (hostname back1.foo.fr)
  (resource(id memory)(quantity 1024))
 )
 (host back2
  (hostname back2.foo.fr)
  (resource(id memory)(quantity 1024))
 )
 (cluster back-servers
  (hosts back1 back2)
  (balancing first) # run on first server with enough resource
 )
)

Configuring alerting and log files

(config
 (taskgroup app1.jobs (label scheduled jobs for app1))
 (task backup # daily backup job sample
  (taskgroup app1.jobs)
  (mean exec)
  (command /opt/app1/scripts/backup.sh)
  (trigger(cron 0 0 23 * * *)) # like cron, with seconds
 )
 (alerts
  (subscription(pattern task.failure.app1.batch.**)
   (mail (address gb@localhost))
  )
  (subscription(pattern task.failure.app1.batch.**)
   (url(address udp://127.0.0.1:4242)
       (emitmessage task failure: %!alertid)
       (cancelmessage task back to success: %!alertid)
   )
   (stop) # do not process next rules if this one matches
  )
  (subscription(pattern resource.exhausted.**)
   (mail (address gb@localhost))
  )
  (remindperiod 43200) # 12h between reminder mails
 )
 (log(level debug)(file "/tmp/qron-debug-%{=date!yyyyMMdd}.log"))
 (log(level info)(file "/tmp/qron-%{=date!yyyyMMdd}.log"))
)

Start the daemon

You need can start the daemon by hand:

./qrond --config-file /path/to/qron.conf

Or use the provided systemd service unit file (qron.service) following README instructions.

Contact Us

Development team can be reached by email at: