Este es un seguimiento de mi otra publicación Installing signal handler with Python. En resumen, Linux bloquea todas las señales a PID 1 (incluyendo SIGKILL) a menos que Init haya instalado un manejador de señal para una señal particular; para evitar el pánico del núcleo si alguien enviara una señal de terminación a PID1. El problema que he tenido, es que parece que el módulo signal
en Python no instala manejadores de señal de una manera que el sistema reconoce. El guión de My Python Init aparentemente ignoraba por completo todas las señales, ya que creo que estaban bloqueadas.señales de bloqueo de Linux a Python init
Parece que he encontrado una solución; utilizando ctypes
para instalar los manejadores de señal con la función signal()
en libc (en este caso uClibc). A continuación, se muestra un init de prueba basado en Python. Abre un shell en TTY2 desde el cual puedo enviar señales a PID1 para probar. Parece que funciona en el KVM im que se usa para probar (estoy dispuesto a compartir el VM con cualquier persona interesada)
¿Es esta la mejor manera de solucionar este problema? ¿Hay una "mejor" forma de instalar los manejadores de señal sin el módulo de señal? (No estoy para nada preocupado con portably)
¿Esto es un error en Python?
#!/usr/bin/python
import os
import sys
import time
from ctypes import *
def SigHUP():
print "Caught SIGHUP"
return 0
def SigCHLD():
print "Caught SIGCHLD"
return 0
SIGFUNC = CFUNCTYPE(c_int)
SigHUPFunc = SIGFUNC(SigHUP)
SigCHLDFunc = SIGFUNC(SigCHLD)
libc = cdll.LoadLibrary('libc.so.0')
libc.signal(1, SigHUPFunc) # 1 = SIGHUP
libc.signal(17, SigCHLDFunc) # 17 = SIGCHLD
print "Mounting Proc: %s" % libc.mount(None, "/proc", "proc", 0, None)
print "forking for ash"
cpid = os.fork()
if cpid == 0:
os.closerange(0, 4)
sys.stdin = open('/dev/tty2', 'r')
sys.stdout = open('/dev/tty2', 'w')
sys.stderr = open('/dev/tty2', 'w')
os.execv('/bin/ash', ('ash',))
print "ash started on tty2"
print "sleeping"
while True:
time.sleep(0.01)
Esto realmente pertenece en codereview.SE, pero +1 para la genial idea de implementar 'init' en Python. –
pensé que podría ser donde debería publicar, pero no me fijo en este método de hacerlo y pensé que podría haber muchas ideas en las que no había pensado. – tMC