Reputation: 2631
I need to find a right way to prevent two running instances of my (Python) program. I am currently using the following method.
On Windows,
os.popen('wmic process get caption,processid | findstr `programname.exe`')
On Linux,
os.popen('ps x | grep `programname`')
It seems to work fine for now. Is this method correct? Can someone suggest to me a better way?
edit: Thanks for the reply guys, Is anything wrong with the above methods? I tried the pid file way for linux. What if the pid file gets deleted somehow?
Upvotes: 8
Views: 7280
Reputation: 62593
on Linux, I used to write a pidfile, roughly:
if (pidfile already exists)
read pidfile content
if (/proc/<pid>/exec == my executable)
already running, exit
else
it´s a stale pidfile, delete it
write my own pid to pidfile
start the 'real' work
lately, i´ve heard of the flock(1) tool. it´s easier to use in bash scripts:
( flock -n 200 || exit
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
and not too hard to use from 'real' programming languages, just open a file and try to get a flock(2) on it.
Upvotes: 2
Reputation: 96716
There are numerous ways:
What you need is a service (external to your application) that manages a namespace where unique ids are available & enforced.
Upvotes: 5
Reputation: 6494
For linux, see the answer from jldupont. For windows, use the CreateMutex-method, to create a named mutex. See: http://msdn.microsoft.com/en-us/library/ms686927%28VS.85%29.aspx
Upvotes: 1