2012-09-01 16 views
7

Ho uno script python che voglio permettere solo di essere in esecuzione una volta su una macchina. Voglio che stampi qualcosa come "Errore, già in esecuzione" se è già in esecuzione, se è in esecuzione in background o in una sessione ssh diversa. Come lo farei? Ecco la mia sceneggiatura.Consenti solo un'istanza di script python?

import urllib, urllib2, sys 
num = sys.argv[1] 
print 'Calling' 
phones = [ 
'http://phone1/index.htm', 
'http://phone2/index.htm', 
'https://phone3/index.htm', 
'https://phone4/index.htm', 
'https://phone5/index.htm' 
] 
data = urllib.urlencode({"NUMBER":num, "DIAL":"Dial", "active_line":1}) 
while 1: 
    for phone in phones: 
     try: 
      urllib2.urlopen(phone,data) # make call 
      urllib2.urlopen(phone+"?dialeddel=0") # clear logs 
     except: pass 

P.S Sto usando CentOS 5 se questo è importante.

risposta

3
  1. È possibile implementare un blocco sul file.
  2. Creare un file temporaneo all'inizio dell'esecuzione e controllare se quel file è presente prima di eseguire lo script.

Fare riferimento a questo post per risposta- Check to see if python script is running

+0

Se avete intenzione di inviare solo un link, si può decidere di citare da un po 'pure. – icktoofay

+1

Grazie per il suggerimento. – fatrock92

+0

Il problema è che lo script è un ciclo infinito, quindi non arriverà mai alla fine dello script in cui viene rimosso il blocco. –

0

Si potrebbe bloccare un file esistente usando per esempio flock all'inizio del tuo script. Quindi, se lo stesso script viene eseguito due volte, l'ultimo avviato si bloccherebbe. Vedi anche this question.

+0

Il problema è che lo script è un ciclo infinito, quindi non arriverà mai alla fine dello script in cui viene rimosso il blocco. –

+0

È possibile aggiungere un gestore per 'SIGTERM' o' SIGQUIT' che cancella un fleg utilizzato come condizione di loop. –

+0

Potresti spiegarmi come si fa e cosa significa? Come sono nuovo in Python –

2

È possibile installare il pacchetto single con che utilizzerà un blocco di avviso per garantire che solo una singola istanza di un comando verrà eseguita senza lasciare indietro i file di blocco non aggiornati.

È possibile richiamare sul vostro script come questo:

single.py -c long-running-script arg1 arg2 
+0

Comando PIP non trovato. Come lo farei su centos? Non esiste un pacchetto singolo con yum –

+0

Potrebbe essere necessario eseguire prima sudo easy_install pip'. Quindi pip scaricherà il singolo pacchetto automaticamente da qui: http://pypi.python.org/pypi/single/ – aculich

+0

Dopo aver installato pip, quindi facendo pip install single, ho ricevuto questo http://pastebin.com/6MTmHkMT –

Problemi correlati