Beefy Boxes and Bandwidth Generously Provided by pair Networks Frank
The stupid question is the question not asked
 
PerlMonks  

Re: Cron Jobs That Run For Too Long

by sgifford (Prior)
on Dec 20, 2005 at 20:02 UTC ( #518173=note: print w/ replies, xml ) Need Help??


in reply to Cron Jobs That Run For Too Long

On Unix, there are three common ways to solve this.

The first way is to have a lockfile that's always around. When your script starts, it tries to lock that file with flock; if it's already locked it exits, otherwise it does its work. The OS will automatically remove the lock when the process exits, even if it crashes or is killed.

The second way is to write the PID of the process into the lockfile. Then when another copy starts up, it checks if the lockfile exists, and if so it reads the PID and verifies that that PID is still running and is actually itself. If it finds that the process is no longer running, it just creates a new lock file and goes on. When the process finishes it removes the lockfile.

The third way is to get a list of all processes, and see if any of those are executing that script. If so, exit.

I generally favor the first of these, because it's easy and efficient.


Comment on Re: Cron Jobs That Run For Too Long
Download Code
Re^2: Cron Jobs That Run For Too Long
by ruoso (Curate) on Dec 20, 2005 at 22:07 UTC

    Just a note, adding to what sgifford said...

    I've seen some scripts around listing /proc to check if the process is still running. I prefer to use a kill 0 on the proccess...

    And I, personally, prefer the second way because it can be used for lockfiles even if the only place you can write the lockfile can't provide locking, or the locking isn't reliable (NFS)

    daniel
      But wait, it gets better again!

      You know how you can have that nifty __DATA__ block at the end of your script? It turns out you can lock that too :)

      I've used this a number of times and it works just great.

      #!/usr/bin/perl

      use strict;
      use Fcntl 'LOCK_EX', 'LOCK_NB';

      unless ( flock DATA, LOCK_EX | LOCK_NB ) {
          print STDERR "Found duplicate script run. Stopping\n";
          exit(0);
      }

      ...

      1;





      ### DO NOT REMOVE THE FOLLOWING LINES ###

      __DATA__
      This exists to allow the locking code at the beginning of the file to work.
      DO NOT REMOVE THESE LINES!

        hey, that's really nice.
        this works great!!! can you give explenations on the __DATA__ part? I dont have a clue what is this for... Roy

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://518173]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (12)
As of 2014-04-21 14:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (495 votes), past polls