22

Could you advise me what to write in crontab so that it runs some job (for testing I will use /usr/bin/chromium-browser) every 15 seconds?

Anthon
  • 79,293
xralf
  • 15,415

4 Answers4

34

You can't go below one minute granularity with cron. What you can do is, every minute, run a script that runs your job, waits 15 seconds and repeats. The following crontab line will start some_job every 15 seconds.

* * * * * for i in 0 1 2; do some_job & sleep 15; done; some_job

This script assumes that the job will never take more than 15 seconds. The following slightly more complex script takes care of not running the next instance if one took too long to run. It relies on date supporting the %s format (e.g. GNU or Busybox, so you'll be ok on Linux). If you put it directly in a crontab, note that % characters must be written as \% in a crontab line.

end=$(($(date +%s) + 45))
while true; do
  some_job &
  [ $(date +%s) -ge $end ] && break
  sleep 15
  wait
done
[ $(date +%s) -ge $(($end + 15)) ] || some_job

I will however note that if you need to run a job as often as every 15 seconds, cron is probably the wrong approach. Although unices are good with short-lived processes, the overhead of launching a program every 15 seconds might be non-negligible (depending on how demanding the program is). Can't you run your application all the time and have it execute its task every 15 seconds?

  • could also be : for i in 1 2 3 4 ; do some_job & sleep 15; done (the last sleep won't affect the next run), but the way you do it is probably better for the timing of the outgoing cronjob mail (sent just after the last some_job, intead of 15s later in my variant) – Olivier Dulac Apr 27 '16 at 12:55
  • Related https://unix.stackexchange.com/questions/478703/does-this-script-run-a-program-once-as-close-as-to-every-15-seconds-and-not-run – Tim Oct 30 '18 at 17:08
17

Different approach than the others: Run 4 cronjobs, each staggered by 15 seconds:

* * * * * sleep 00; timeout 15s some_job
* * * * * sleep 15; timeout 15s some_job
* * * * * sleep 30; timeout 15s some_job
* * * * * sleep 45; timeout 15s some_job

To prevent the job from interfering with itself, we limit its run-time to 15 seconds via GNU coreutils' timeout for each job. Note, however, that if the job fails to properly exit immediately at the end of 15s, you may still end up with problems. See the command manual for details on how to resolve that if it becomes a problem. Also note, if the command does take longer than 15s, and timeout kills it, you will get a non-zero exit status which will trigger a cronjob-email.

Otheus
  • 6,138
  • Brilliant, albeit repetitive. – Mike Kormendy Apr 01 '17 at 19:33
  • 1
    Nice. If a process runs long then the next process would probably end up on a different core as well. Not sure if you can deliberately set core affinity for Cron jobs, but that might make this approach even better. – Tim Jan 03 '18 at 11:39
  • @Tim good point. I addressed that somewhat in an edit. – Otheus Feb 05 '18 at 10:50
2

In short, cron is not that granular with time. The shortest period you will get is 1 min.

#       .---------------- minute (0 - 59)
#       |       .------------- hour (0 - 23)
#       |       |       .---------- day of month (1 - 31)
#       |       |       |       .------- month (1 - 12) OR jan,feb,mar,apr ...
#       |       |       |       |       .----- day of week (0 - 6) (Sunday=0 or 7)  OR sun,mon,tue,wed,thu,fri,sat
#       |       |       |       |       |
#       *       *       *       *       *       command to be executed
        *       *       *       *       /usr/bin/chromium-browser

However you could write a script that would run every 15 seconds...

rfelsburg
  • 645
  • I have a line * * * * * /usr/bin/chromium-browser in crontab. According to manual it should run every minute but nothing is running. – xralf Apr 11 '11 at 19:12
  • Is it difficult to write such a script? Should I ask another question or could it be written here? – xralf Apr 11 '11 at 19:13
  • Cron jobs don't have a terminal so I would expect the browser to fail. It may do so silently. – BillThor Apr 11 '11 at 19:14
  • My cron logs are located in /var/log/cron for derivatives of redhat, ie. fedora, centos etc. It also may help for you to describe exactly what you are trying to do so people have a full picture of what is going on. – rfelsburg Apr 11 '11 at 19:17
2

In your crontab:

* * * *  /usr/bin/chromium-browser_starter

Then in /usr/bin/chromium-browser_starter:

#!/bin/sh

# chromium-browser_starter
#
# Schedules /usr/bin/chromium-browser to run every 15 seconds for a minute.
# Intended to be called every minute through crond(8).

for ((secs=0; secs<46; secs+=15)); do
    (sleep $secs; /usr/bin/chromium-browser "$@") &
done

wait
amphetamachine
  • 5,517
  • 2
  • 35
  • 43