Lazer
Lazer

Reputation: 94850

How can I run my program code after fixed intervals?

I have this Perl script for monitoring a folder in Linux.

To continuously check for any updates to the directory, I have a while loop that sleeps for 5 minutes in-between successive loops :

while(1) {

    ...
    sleep 300;
}

Nobody on my other question suggested using cron for scheduling instead of a for loop.

This while construct, without any break looks ugly to me as compared to submitting a cronjob using crontab :

0 */5 * * * ./myscript > /dev/null 2>&1

Also, I'm using a 2.6.9 kernel build.

Upvotes: 1

Views: 1887

Answers (5)

Rohan Monga
Rohan Monga

Reputation: 1777

if you don't want to use cron. this http://upstart.ubuntu.com/ can be used to babysit processes. or you can use watch whichever is easier.

Upvotes: 0

David Cary
David Cary

Reputation: 5490

Yet another alternative is the 'anacron' utility.

Upvotes: 0

Jonathan Leffler
Jonathan Leffler

Reputation: 753990

  1. Why don't you make the build process that puts the build into the directory do the notification? (See SO 3691739 for where that comes from!)

  2. Having cron run the program is perfectly acceptable - and simpler than a permanent loop with a sleep, though not by much.

  3. Against a cron solution, since the process is a simple one-shot, you can't tell what has changed since the last time it was run - there is no state. (Or, more accurately, if you provide state - via a file, probably - you are making life much more complex than running a single script that keeps its state internally.)

  4. Also, stopping the notification service is less obvious. If there's a single process hanging around, you kill it and the notifications stop. If the notifications are run by cron, then you have to know that they're run out of a crontab, know whose crontab it is, and edit that entry in order to stop it.

  5. You should also consider persuading your company to upgrade to a version of Linux where the inotify mechanism is available.

Upvotes: 4

Sec
Sec

Reputation: 7344

If you go for the loop instead of cron and want your job run at regular intervals, sleep(300) tends to drift. (consider the execution time of the rest of your script)

I suggest using a construct like this:

use constant DELAY => 300;

my $next=time();
while (1){
    $next+=DELAY;

    ...;

    sleep ($next-time());
};

Upvotes: 1

paxdiablo
paxdiablo

Reputation: 881563

The only reasons I have ever used the while solution is if either I needed my code to be run more than once a minute or if it needed to respond immediately to an external event, neither of which appear to be the case here.

My thinking is usually along the lines of: cron has been tested by millions and millions of people over decades so it's at least as reliable as the code I've just strung together.

Even in situations where I've used while, I've still had a cron job to restart my script in case of failure.

My advice would be to simply use cron. That's what it's designed for. And, as an aside, I rarely redirect the output to /dev/null, that makes it too hard to debug. Usually I simply redirect to a file in the /tmp file system so that I can see what's going on.

You can append as long as you have an automated clean-up procedure and you can even write to a more private location if you're worried about anyone seeing stuff in the output.

The bottom line, though, is that a rare failure can't be analysed if you're throwing away the output. If you consider your job to be bug-free then, by all means, throw the output away but I rarely consider my scripts bug-free, just in case.

Upvotes: 5

Related Questions