Ejecutar código en script python en señal de apagado

Tengo una secuencia de comandos de Python que se ejecuta en segundo plano en el inicio. El método de inicio es una entrada en un archivo run.sh que se llama con /etc/rc.local. La entrada exacta sería “sudo python /home/pi/run/main.py &”. El sistema es una pi raspberry con sibilancias.

El script está en ejecución, no hay problema hasta ahora. Si se envía un comando de apagado al sistema (a través de la consola “sudo shutdown -h now”) necesito más el script para no abortar de inmediato, sino para ejecutar primero algún código. Eso es lo que tengo hasta ahora:

#!/usr/bin/env python import atexit @atexit.register def byebye(): c = "End" datei = open("/home/pi/logfile",'a+b') datei.write(c + "\n") datei.close() def main(): while True: ...do anything... main() 

En este momento parece que acaba de salir del bucle principal al apagar. ¿Debo utilizar una forma diferente de apagar el sistema para que la señal se transmita a mi script o es posible que no haya obtenido el uso del método “@atexit”? ¿Algunas ideas?

Gracias

shutdown envía la señal SIGTERM , que atexit no maneja. Tampoco los gestores de contexto, finally bloques, etc.

 import signal signal.getsignal(signal.SIGTERM) Out[64]: 0 #ie nothing 

Contraste esto con, digamos ctrl-C:

 signal.getsignal(signal.SIGINT) Out[65]:  #ie something 

Puede registrar su función de byebye con una signal para ejecutar en lugar de no hacer nada (lo que hace que el intérprete acabe siendo asesinado por el shell)

 signal.signal(signal.SIGTERM,byebye) 

Si haces lo anterior deberás hacer dos cosas:

  • cambie la firma de byebye para aceptar los dos argumentos que la signal pasará.
  • Debería hacer algo como llamar a sys.exit() al final de su función de byebye para permitir que Python cierre la tienda con gracia.

Alternativamente, podrías hacer una combinación de signal y atexit :

 import sys signal.signal(signal.SIGTERM, lambda num, frame: sys.exit(0)) 

Lo que caería directamente en su código actual. Esto garantiza la atomicidad de su operación de limpieza (es decir, se garantiza que byebye será la última operación de E / S) al costo de ser un poco torpe.