Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Cron Jobs That Run For Too Long

by sgifford (Prior)
on Dec 20, 2005 at 20:02 UTC ( [id://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.

Replies are listed 'Best First'.
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!

        (For the record if someone reads this thread again)

        Cool trick, but strongly discouraged on Windows.

        See Re^2: File lock demo and other links in that thread for explanation.

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery

        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
        11 years later this is still brilliant.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (6)
As of 2024-04-23 15:57 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found