SPUG: Perl Question?

dleonard at dleonard.net dleonard at dleonard.net
Wed May 4 15:01:56 PDT 2005

On Wed, 4 May 2005, James Moore wrote:

> > I would recommend instead querying the process table for other processes
> > running as $0.
> There's no atomic way of doing this that I know about, though.  You need
> some sort of real mutex mechanism; lock files, semaphores, whatever, but
> something that helps you deal with race conditions.
> I guess you could do something like look at the process table and declare
> that the lowest PID wins; if there's another process running and its PID <
> your PID, then you should exit.  Feels suspicious, though - am I missing
> something that would break this?  For one, it's not portable, but I'd also
> assume in my suspicious little heart that anything relying on file locking
> is going to snap like a twig if you try to go between substantially
> different OSes, too.

Sequential process ids aren't a guarantee nowadays.  However, if all you are trying to do is guarantee singleton or fixed number of running processes then querying proc via Proc::ProcessTable or a home grown solution (what I've commonly done) pretty much eliminates the possible of multiple processes of the same time running simultaneously.

On a unix box something as simple as

my @procs = `ps axo command | grep $0 | grep -v grep`;
die "More than one [$0] process running.\n" if scalar @procs > 1;

is good enough in most instances.  It doesn't handle substrings or other processes that operate on the thing you are executing but instead errs on the side of caution.



More information about the spug-list mailing list