Limit the runtime of a cronjob or script

Oh Dear! monitors your entire site, not just the homepage. We crawl and search for broken pages and mixed content, send alerts when your site is down and notify you on expiring SSL certificates.

Start your free 10 day trial! »

Image of Mattias Geniar

Mattias Geniar, May 29, 2016

Follow me on Twitter as @mattiasgeniar

There are ways you can prevent cronjobs from overlapping, but you can also limit how long a particular script can run.

This doesn’t just apply to cronjobs but to all scripts, actually, but this guide focusses on cronjobs.

Setting timeouts

The hidden secret is the timeout command. From the manpages:

timeout – run a command with a time limit

And it’s very simple to use.

Limit the time a cronjob can run

To avoid endless cronjobs, change your crontab like this:

$ crontab -l
* * * * * /path/to/your/script.sh

To:

$ crontab -l
* * * * * /bin/timeout -s 2 10 /path/to/your/script.sh

Here’s the breakdown:

  • /bin/timeout: the command.
  • -s 2: the signal to send when the timer has exceeded, it can be a number or the name. Equally valid would have been -s SIGINT (more on the kill signals below)
  • 10: the duration the script can run, before the kill signal described above is sent to it.

So the command above will send the SIGINT signal to the script whenever the timer of 10 seconds has been exceeded.

You can use interesting arguments like --preserve-status to have the timeout command return the same exit code as the script you executed.

The correct kill signal

For a list of valid kill signals, use kill -l.

$ kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

Each of these can be used with its numeric value or the name of the signal.

Will you help me share this post?

It would mean a lot to me if you could help share this post on social media. 🤗