2012-09-01 9 views
7

Tengo un script de python que solo quiero permitir que se ejecute una vez en una máquina. Quiero que imprima algo así como "Error, ya se está ejecutando" si ya se está ejecutando, si se está ejecutando en segundo plano o en una sesión ssh diferente. ¿Cómo haría esto? Aquí está mi script.¿Permitir solo una instancia de 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 Estoy utilizando CentOS 5 si eso es importante.

Respuesta

3
  1. Puede implementar un bloqueo en el archivo.
  2. Cree un archivo temporal al inicio de la ejecución y compruebe si ese archivo está presente antes de ejecutar el script.

Consulte este puesto de respuesta- Check to see if python script is running

+0

Si vas a publicar sólo un enlace, es posible que desee citar de que sea un poco así. – icktoofay

+1

Gracias por el consejo. – fatrock92

+0

La cuestión es que el script es un bucle infinito, por lo que nunca llegaría al final del script donde se elimina el bloqueo. –

0

Se puede bloquear un archivo existente utilizando, por ejemplo, flock al inicio de su secuencia de comandos. Entonces, si la misma secuencia de comandos se ejecuta dos veces, la más reciente iniciada se bloquearía. Vea también this question.

+0

La cuestión es que el script es un bucle infinito, por lo que nunca llegaría al final del script donde se quita el bloqueo. –

+0

Puede agregar un controlador para 'SIGTERM' o' SIGQUIT', que borra un fleg usado como una condición de bucle. –

+0

¿Podría explicarme cómo hacer esto y qué significa? Como soy nuevo en python –

2

Puede instalar el paquete single con pip install single que usará un bloqueo de aviso para garantizar que solo se ejecute una instancia única de un comando sin dejar atrás los archivos de bloqueo obsoletos.

Puede invocar en su script como el siguiente:

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

Comando PIP no encontrado. ¿Cómo haría esto en centos? No hay un paquete único con yum –

+0

Puede que tenga que hacer 'sudo easy_install pip' primero. A continuación, pip descargará el paquete único de forma automática desde aquí: http://pypi.python.org/pypi/single/ – aculich

+0

Después de instalar pip, y luego haciendo pip install single, obtengo este http://pastebin.com/6MTmHkMT –

Cuestiones relacionadas