Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
reiniciar script automaticamente
#1
Sad 
Hola a ver si pueden hecharme una mano con un problema que tengo y no se como solucionarlo.

Supongamos que tengo un script.py con un bucle infinito como este:
 * el script funciona perfectamente al ejecutarlo mediante (python3 test.py)

import time
veces = 0
while veces >= 0 :
print ("Numero", veces)
veces = veces +1
time.sleep(1)



El problema radica que por casualidad se me va la conexion a internet (dicho ejemplo no usa ninguna URL claro está), pero quisiera como reiniciar nuevamente el script automaticamente en su terminal correspondiente ya sea usando "cron" u cualquier otro sistema. Y que pasos debiera seguir.
Mi script original se inicia automaticamente al iniciar mi Raspberry sin problemas y todo funciona hasta que por fallo del servidor, exceso de limite de llamadas u otro problema se me cae o mata el script.py

Disculpad mi ignorancia pero estoy aprendiendo atascado en este punto. Muchas gracias

Agradeciria una explicacion clara y si es con un ejemplo mejor que mejor.... Un abrazo
Responder
#2
Hola, bienvenido.

Voy a utilizar como base tu ejemplo, añadiendo una función conectar() que se ejecuta dentro del bucle:

  1. import random
  2. import time
  3.  
  4. def conectar():
  5. n = random.randint(1, 10)
  6. if n == 5:
  7. raise RuntimeError
  8. print("Conectado correctamente.")
  9.  
  10.  
  11. veces = 0
  12. while veces >= 0 :
  13. print ("Numero", veces)
  14. veces = veces +1
  15. conectar()
  16. time.sleep(1)


Supongamos que esa función conectar() es la función que se conecta a internet en tu script. Esta función de ejemplo va a fallar en algún momento (genera un número aleatorio entre 1 y 10, y si es 5, genera un error), al igual que tu función real si se cae la conexión a internet. En ese caso, lo mejor que podés hacer es detectar cuál es la excepción que está lanzando tu función y capturarla para que el bucle continúe y el programa no termine:

  1. veces = 0
  2. while veces >= 0 :
  3. print ("Numero", veces)
  4. veces = veces +1
  5. try:
  6. conectar()
  7. except RuntimeError:
  8. print("Ocurrió un error, volviendo a intentar...")
  9. time.sleep(1)


En tu caso, reemplazarías RuntimeError por el nombre de la excepción que realmente arroja tu función, y en lugar del print() podés ejecutar algún código que te avise que el programa está fallando, o lo que vos quieras.

Espero haber sido claro.

Saludos!
Responder
#3
Gracias por tu aporte Francisco,
entiendo perfectamente cual tu idea, pero no es factible porque la captura del valor que estoy realizando es mediante scrapy, de manera que el valor que raspo en la WEB, me tira el script por fallo de la misma (ya sea por limit-callings), solucionado con mas retardo o por fallo de la misma... por eso te pregunto fuera del script, si existe algun metodo para relanzar un script caido?
Responder
#4
Hola. ¿Podrías ser más claro respecto de lo que le pasa a tu script? Un programa de Python solo termina si ocurre una excepción o si llega al final del código. Como mencionaste que hay un bucle infinito, estimo que está terminando por una excepción (incluso si es generada por Scrapy), por lo que se aplica el método anterior. (Podría ocurrir, no obstante, que, como Scrapy está basado en Twisted, sea un poco más complejo que lo anterior manejar la excepción). Si lo que estás obteniendo es un error HTTP de la web que visitás vía Scrapy, entonces se resolvería chequeando el código de estado de la respuesta HTTP.

Como sea, si no querés tocar el código de fuente de tu script, podrías crear otro que lo invoque utilizando subprocess, y lo vuelva a llamar una vez terminado. Sobre esto te dejo esta guía: https://recursospython.com/guias-y-manua...-procesos/.

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)