[Python-es] Lanzar aplicación como demonio
marco
python en diezplus.com
Mie Mar 2 18:04:46 CET 2011
El 02/03/2011 16:42, Oswaldo Hernández escribió:
> El 01/03/2011 20:15, Sergio Fernández escribió:
>> ¿por qué no le echas un vistazo al módulo daemon...?
>> http://pypi.python.org/pypi/python-daemon/
Ya le he echado un vistazo a ese módulo, pero sólamente funciona bajo
Unix. Gracias.
>>
>> 2011/3/1 marco<python en diezplus.com>:
>>> Hola a todos!!
>>>
>>> Tengo la siguiente duda.
>>>
>>> Necesito lanzar un proceso que quede residente en memoria y que cada
>>> cierto
>>> tiempo ejecute algo,
>>> debería quedar tipo demonio de linux o tipo TSR (Terminate and Stay
>>> Resident).
>
> Terminate and Stay Resident ... Ufff hace mas de 10 años que no veia
> eso ;)
>
>>> Utilizo python 2.6 sobre Windows 7.
>>> Mirad el siguiente ejemplo,
>>>
>>> #leer_com.py###########################
>>> import threading, time
>>> def espera():
>>> while True:
>>> time.sleep(15)
>>> # comprobaciones varias
>>> # etc
>>> print "comprobando..."
>>> p = threading.Thread(target = espera,)
>>> p.setDaemon(True)
>>> p.start()
>>> ######################################
>>>
>>> Si lo ejecuto en una shell de python, sin problema, cada 15 segundos me
>>> ejecuta la función espera,
>>> mientras tanto yo puedo seguir trabajando con cualquier cosa desde
>>> esa misma
>>> shell.
>>> Ahora bien, si lo ejecuto desde una línea de comandos del sistema, ej.:
>>> c:\>python leer_com.py
>>> acaba el programa y no hace nada de nada. Lo he convertido a
>>> ejecutable con
>>> py2exe y más de
>>> lo mismo, no funciona. Si hago p.join() en el script queda en
>>> espera pero
>>> no vuelve al interprete de comandos
>>> que lo que yo necesito. Necesito lanzarlo y a ejecutar otra cosa.
>
> El programa termina porque se alcanza el final y ya no tiene nada que
> hacer. Aunque hayas lanzado el tread debes mantenerlo vivo, un simple
> 'while True: pass' al final hara lo que necesitas.
>
> Para simular un daemon en windows puedes crear un servicio con py2exe
> o simplemente hacer que se cargue al arrancar el equipo.
>
> Saludos,
Ya se que ha de mantenerse vivo el thread, si hago p.join() o while True
como me aconsejas hace que se mantenga, pero el programa no finaliza. Lo
que yo necesito es lanzarlo desde una shell y que quede residente aunque
yo cierre la shell y que funcione bajo Windows 7. No quiero que sea un
servicio de windows, necesito que sea simple python sin acceso a API de
windows, lo que no se si esto será posible...
Gracias.
Más información sobre la lista de distribución Python-es