2009-12-14 15 views
7

Ho bisogno di trovare il modo giusto per evitare due istanze in esecuzione del mio programma (Python). Attualmente sto usando il seguente metodo.Come evitare più istanze di un programma?

In Windows,

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

Su Linux,

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

Sembra funzionare bene per ora. Questo metodo è corretto? Qualcuno può suggerirmi un modo migliore?

modifica: Grazie per la risposta ragazzi, C'è qualcosa di sbagliato con i metodi di cui sopra? Ho provato il modo di file pid per linux. Cosa succede se il file pid viene eliminato in qualche modo?

+1

Duplicato: http://stackoverflow.com/questions/380870/python-single-instance-of-programme –

+0

Correlati: http://stackoverflow.com/questions/220525/ensuring-unsingle-instance-di -an-application-in-linux # 221159 –

+0

Questo è fondamentalmente un duplicato di [python-single-instance-of-program] (http://stackoverflow.com/questions/380870/python-single-instance-of- programma) domanda. –

risposta

5

Ci sono numerosi modi:

  1. avere un "file di istanza" in/var/run o simile (piattaforme)
  2. utilizzare una presa fissa (piattaforme)
  3. uso DBus registrare un nome (linux)

quello che vi serve è un servizio (esterno alla propria applicazione) che gestisce uno spazio dei nomi in cui sono disponibili & forzata iD univoci.

1

su Linux, ho usato per scrivere un pidfile, più o meno:

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 

ultimamente, ho sentito dire dello strumento flock(1). E'più facile da usare in script bash:

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

e non troppo difficile da usare da linguaggi di programmazione 'reali', basta aprire un file e cercare di ottenere un flock(2) su di esso.

Problemi correlati