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 s开发者_StackOverflow中文版leeps 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
- Is cron the right choice? Are there any advantages of using the while loop construct?
- Are there any better ways of doing this except the loop and cron?
Also, I'm using a 2.6.9 kernel build.
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.
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!)
Having
cron
run the program is perfectly acceptable - and simpler than a permanent loop with a sleep, though not by much.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.)
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.You should also consider persuading your company to upgrade to a version of Linux where the inotify mechanism is available.
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());
};
Yet another alternative is the 'anacron' utility.
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.
精彩评论