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?
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:
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á:
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.