es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Servicio Python de autoactualización se mata a sí mismo.

TLDR: Quiero actualizarme a mi mismo de git. El script de Bash necesita detener este servicio. Pero mata a la propia actualización. ¿Cómo iniciar el script de Bash desde Python para que termine incluso si se mata el script de Python?

Quiero ejecutar el script de Bash de actualización propia (update.sh) desde el script de Python que se está ejecutando como un servicio para actualizar el servicio. El problema es que necesito detener el servicio porque necesito sacar nuevos datos de git. Sin detener el servicio, debo terminar con datos corruptos.

Este es parte del script de Python que se ejecuta como servicio. Esta parte debería encargarse de la actualización propia del servicio:

import subprocess

subprocess.call(‘sudo /home/pi/myproject/update.sh’, shell=True)

Este es el script update.sh (100% funcional si lo ejecuto en la terminal):

h1>

systemctl stop myproject.service

su – pi -c “cd /home/pi/myproject; git reset –hard; git pull;”
su – pi -c “cd /home/pi/myproject; chmod +x update.sh”

systemctl start myproject.service

Cuando se ejecuta el comando systemctl stop myproject.service, el servicio es detenido y las siguientes líneas no se ejecutan.

¿Es posible iniciar update.sh en algún entorno que se finalice incluso si se mata myproject.service?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible iniciar update.sh en un entorno que se finalizará aunque myproject.service sea detenido. Puede usar el comando nohup para ejecutar el script update.sh en segundo plano y redirigir su salida a un archivo. Esto garantizará que el script continúe ejecutándose aunque el script Python sea detenido. Así es como puede modificar su script Python para lograr esto:

    import subprocess
    
    subprocess.call('sudo nohup /home/pi/myproject/update.sh > /dev/null 2>&1 &', shell=True)
    

    El comando nohup ejecutará el script update.sh en segundo plano y la salida se redirigirá al dispositivo null (/dev/null) para descartarla. La sintaxis 2>&1 redireccionará tanto la salida de error como la salida estándar al dispositivo null. Esto evitará que el script Python espere a que se termine de ejecutar el script update.sh, permitiendo que continúe ejecutándose aunque el servicio sea detenido o interrumpido.

    Además, es posible que desee agregar un manejo de errores a su script Python para detectar si el script update.sh no se ejecutó correctamente o si encontró algún error. Puede verificar si el proceso update.sh sigue en ejecución utilizando el comando ps y mostrar un mensaje de error si no lo está:

    import subprocess
    
    update_process = subprocess.Popen('sudo nohup /home/pi/myproject/update.sh > /dev/null 2>&1 &', shell=True)
    if update_process.poll() is not None:
        print('Error: el script update.sh no se inició correctamente')
    

    La función Popen devuelve un objeto Process que representa el proceso en ejecución. Puede utilizar el método poll para verificar si el proceso ha salido. Si devuelve None, el proceso sigue en ejecución y puede continuar con el resto del código Python. Si devuelve un valor distinto de cero, el proceso ha finalizado y se debe mostrar un mensaje de error.

Comments are closed.