Python - Atrapa todas las señales.



2 Answers

A partir de Python 3.5, las constantes de señal se definen como una enumeración , lo que permite un enfoque más agradable:

import signal

catchable_sigs = set(signal.Signals) - {signal.SIGKILL, signal.SIGSTOP}
for sig in catchable_sigs:
    signal.signal(sig, print)  # Substitute handler of choice for `print`
Question

En Python 2.6 en Linux, puedo usar lo siguiente para manejar una señal TERM:

import signal
def handleSigTERM():
    shutdown()
signal.signal(signal.SIGTERM, handleSigTERM)    

¿Hay alguna forma de configurar un controlador para todas las señales recibidas por el proceso, aparte de configurarlas una a la vez?




Aquí hay una forma compatible con 2/3 que no tiene tantos escollos como los demás:

from itertools import count
import signal

def set_all_signal_signals(handler):
    """Set all signals to a particular handler."""
    for signalnum in count(1):
        try:
            signal.signal(signalnum, handler)
            print("set {}".format(signalnum))
        except (OSError, RuntimeError):
            # Invalid argument such as signals that can't be blocked
            pass
        except ValueError:
            # Signal out of range
            break

Dado que signalnum es solo un número, repita de 1 a fuera de rango y establezca la señal en un identificador particular.




Related