2009-12-14 6 views
7

J'ai besoin de trouver une bonne façon d'empêcher deux instances en cours de mon programme (Python). J'utilise actuellement la méthode suivante.Comment éviter plusieurs instances d'un programme?

Sous Windows,

os.popen('wmic process get caption,processid | findstr `programname.exe`') 

Sur Linux,

os.popen('ps x | grep `programname`') 

Il semble fonctionner très bien pour l'instant. Cette méthode est-elle correcte? Quelqu'un peut-il me suggérer un meilleur moyen?

edit: Merci pour la réponse les gars, Quelque chose ne va pas avec les méthodes ci-dessus? J'ai essayé le chemin du fichier pid pour linux. Que faire si le fichier PID est supprimé d'une manière ou d'une autre?

+1

Dupliquer: http://stackoverflow.com/questions/380870/python-single-instance-of-program –

+0

En relation: http://stackoverflow.com/questions/220525/suring-a-single-instance-of -an-application-in-linux # 221159 –

+0

Il s'agit essentiellement d'un doublon de [python-single-instance-of-programme] (http://stackoverflow.com/questions/380870/python-single-instance-of- programme) question. –

Répondre

5

Il existe de nombreuses façons:

  1. ont un "fichier d'instance" dans/var/run ou similaire (multiplateforme)
  2. utiliser une prise fixe (multi-plateforme)
  3. utilisation DBus enregistrer un nom (linux)

Qu'est-ce que vous avez besoin est un service (externe à votre application) qui gère un espace de noms où ids uniques sont disponibles appliquées &.

1

sur Linux, je l'habitude d'écrire un pidfile, à peu près:

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 

ces derniers temps, j'ai entendu de l'outil flock(1). d'une manière plus facile à utiliser dans les scripts bash:

(flock -n 200 || exit 
    # ... commands executed under lock ... 
) 200>/var/lock/mylockfile 

et pas trop difficile à utiliser des langages de programmation « réelles », il suffit d'ouvrir un fichier et essayer d'obtenir un flock(2) sur elle.

Questions connexes