84

I have a script that needs to be run every five seconds. I know that cron can do tasks by the minute, but is there a way to run something every second?

guntbert
  • 13,134
myusuf3
  • 34,189
  • 3
    What problem are you trying to solve? Are you sure cron is the right solution? – andol Aug 04 '10 at 19:11
  • 1
    I know cron isn't the right solution. I was saying it wasn't in the question. Please read. I am trying to make a script run every 5 seconds. – myusuf3 Aug 04 '10 at 19:20
  • 2
    Sorry, guess I got the question slightly wrong. Yet, still wondering if you are trying to solve the right problem. – andol Aug 04 '10 at 19:25
  • For people coming here looking how to run something every 5 seconds. I strongly recommend instead you look at learning how to program realtime with tools like socket.io as an example. – Brandon Bertelsen Jul 18 '17 at 19:05
  • Have you discovered the bash sleep command? sleep 5 pauses (perhaps within a loop) for 5 seconds)...? – SDsolar Apr 23 '18 at 19:03

8 Answers8

76

Cron only allows for a minimum of one minute. What you could do is write a shell script with an infinite loop that runs your task, and then sleeps for 5 seconds. That way your task would be run more or less every 5 seconds, depending on how long the task itself takes.

#!/bin/bash

while true; do
  # Do something
  sleep 5;
done

You can create a my-task.sh file with the contents above and run it with sh my-task.sh. Optionally you can configure it with supervisor as a service so that it would start when the system boots, etc.

It really does sound like you're doing something that you probably shouldn't be doing though. This feels wrong.

Jigarius
  • 105
Tommy Brunn
  • 9,751
  • One can need a a cron running every 5 or even less seconds to be used in PHP based scrapers. – Ravish Kumar Dec 26 '17 at 11:57
  • 1
    Really feels wrong. If you include it in a cron job then you will have overlapping jobs every minute. After an hour 60 jobs will be starting every 5 seconds. If you do not include in a cron job, well, you may not be able to know how to stop it, or even to know it exists. – SeF Mar 04 '19 at 14:18
50

You could have a cron job kick-off a script every minute that starts 12 backgrounded processes thusly:

* * * * * ~/dostuff.sh

dostuff.sh:

(sleep 5 && /path/to/task) &
(sleep 10 && /path/to/task) &
(sleep 15 && /path/to/task) &
(sleep 20 && /path/to/task) &
(sleep 25 && /path/to/task) &
(sleep 30 && /path/to/task) &
(sleep 35 && /path/to/task) &
(sleep 40 && /path/to/task) &
(sleep 45 && /path/to/task) &
(sleep 50 && /path/to/task) &
(sleep 55 && /path/to/task) &
(sleep 60 && /path/to/task) &

My question, though, is What on EARTH could you be doing that needs to run every 5 seconds?

  • 1
    Well, this came in handy to me when I made a script that repeatedly checks the /media directory for a drive I plug in to usb for automatic backups... – VF1 Aug 22 '13 at 02:52
  • 60
    What on EARTH - statistics, garbage collection, file sync, online status, you name it. – ruX Jul 16 '16 at 23:53
  • 9
    Referencing external API for near-realtime data. Running request every 5 sec is MUCH better than doing it on every pageview. – Sergey Kudriavtsev Jul 18 '16 at 21:41
  • 1
    What if crontab execute the dostuff.sh file twice? For example at 55th second, the script is executed but didn't finished yet, but the cron calls the script again, what'll happen? – TomSawyer Sep 14 '16 at 09:16
  • Recording usage into a file for a load balancer to review and balance based on. – flickerfly Apr 06 '17 at 12:48
  • Sending CPU Load and Network Usage data back to InfluxDB, using a homegrown monitoring solution. – noɥʇʎԀʎzɐɹƆ Jul 12 '17 at 22:15
  • 3
    THIS IS BAD! It potentially runs the script more than once at a time (if it happens to take longer than 5 seconds) which could lead to a race condition in any (even temporary) files accessed. DO NOT DO THIS if doing the same thing twice at the same time could cause a problem! (And that usually will!) – Nonny Moose Jan 10 '18 at 01:52
  • Running script more than once at a time may not be bad in some cases. Depends on what it's doing. – Gherman Jul 17 '22 at 10:05
29

Just use a loop:

while true ; do ./your-script & sleep 5; done

This will start your-script as a background job, sleep for 5 seconds, then loop again. You can use Ctrl-C to abort it, or use any other condition instead of true, e.g. ! test -f /tmp/stop-my-script to only loop while the file /tmp/stop-my-script does not exist.

Eliah Kagan
  • 117,780
blueyed
  • 8,965
  • If I include the ampersand, it says bash: syntax error near unexpected token ';', so I took it out. I have bash 4.3.11. My command runs quickly so it's ok if it runs in the foreground. – Tyler Collier Dec 04 '16 at 04:48
  • 1
    @TylerCollier If you did need ./your-script to run in the background (during the 5-second sleep), you could keep & but drop the ;. As & serves the purpose of separating the commands, it's unnecessary (and apparently not allowed) to have ; after it on the same line. Another way is to write the loop in multiple lines (with a line break after & and, optionally, line breaks after do and before done as well). Since the ; after & appears to be a typo, I've removed it. blueyed: Please feel free to put the ; back if you really want it; if so, I suggest also adding an explanation. – Eliah Kagan Dec 30 '16 at 20:40
  • @EliahKagan FWIW, it works on Zsh (no syntax error), but it is not really necessary. Thanks for the edit! – blueyed Jan 12 '17 at 11:43
12

You could use the GNU package mcron, a "Vixie cron" alternative.

http://www.gnu.org/software/mcron/manual/mcron.html#Top

"Can easily allow for finer time-points to be specified, i.e. seconds. In principle this could be extended to microseconds, but this is not implemented."

David
  • 262
  • 3
  • 11
  • That is exactly what I was looking for. Thank you! – SDsolar Jun 05 '17 at 09:44
  • Please post this as an answer to my question here: https://askubuntu.com/questions/922216/is-there-a-more-granular-cron-like-scheduler-instead-of-just-by-the-minute-but so I can accept your answer. – SDsolar Jun 05 '17 at 09:47
  • https://stackoverflow.com/questions/44470965/how-can-you-watch-gnuplot-realtime-data-plots-as-a-live-graph-with-automatic-up/44471008#44471008 – SDsolar Jun 15 '17 at 02:37
  • https://askubuntu.com/questions/832072/can-i-use-cron-to-chime-at-top-of-hour-like-a-grandfather-clock?rq=1 – SDsolar Jun 15 '17 at 02:38
  • mcron requires sendmail to be installed and activated by default. how to disable it? – ihsan Jul 11 '17 at 01:04
7

You could use a SystemD timer unit, which will trigger a service - that you'd set up to do what you want - every 5 seconds.

Suppose your service unit is called mystuff.service and is installed in /etc/systemd/system (check out SystemD user services if you want to replace a user's crontab), then you can write a timer unit to run the service at boot time and then every 5 seconds, like this:

/etc/systemd/system/mystuff.timer

[Unit]
Description=my stuff's schedule
[Timer]
OnBootSec=5
OnUnitActiveSec=5
[Install]
WantedBy=timers.target

Then reload the systemd configuration, enable the timer unit and start it.

Guss
  • 3,535
2

Use cacti to monitor router and switch,but Cron only allows for a minimum of one minute,so if one port/device down,there is no warning until two minutes past.

qttty
  • 29
2

Minimum configuration in cron is minutes, you can't set it for 5 seconds. You could use Quartz which does allow seconds. http://www.quartz-scheduler.org/docs/tutorials/crontrigger.html

Cody Harlow
  • 1,452
1

I've done this sort of thing very successfully (and the end result rans weeks at a time, till the machine is rebooted). As for what I was doing right now, updating information and putting it into cache - updating every 10 seconds.

#!/bin/sh

SLEEP=5

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# do stuff
sleep $SLEEP

# echo and restart...
exec $0

The 'exec $0' restarts the script, but replacing the running script. It can be initially started with a crontab '@reboot' line.