(есть ответ на этот вопрос здесь)
Я работаю над попыткой написать систему инициализации на основе Python для Linux, но у меня возникла проблема с получением сигналов для моего сценария инициализации Python. Со страницы «Убить человека 2»:
The only signals that can be sent to process ID 1, the init process, are those for which init has explicitly installed signal handlers.
В моем Init на основе Python у меня есть тестовая функция и настройка обработчика сигналов для вызова этой функции:
def SigTest(SIG, FRM):
print "Caught SIGHUP!"
signal.signal(signal.SIGHUP, SigTest)
С другого TTY (скрипт инициализации выполняет sh на другом tty), если я посылаю сигнал, он полностью игнорируется, и текст никогда не печатается. kill -HUP 1
Я обнаружил эту проблему, потому что я написал функцию сбора урожая для моего Python init, чтобы пожинать его дочерние процессы, когда они умирают, но все они просто зомбированы, потребовалось некоторое время, чтобы понять, что Python никогда не получает сигнал SIGCHLD. Просто чтобы убедиться, что моя среда в порядке, я написал программу на C для разветвления, и ребенок отправил сигнал PID 1, и он зарегистрировался.
Как мне установить обработчик сигналов, который система будет подтверждать, если signal.signal(SIG, FUNC)
не работает?
Я собираюсь попробовать использовать ctypes, чтобы зарегистрировать мой обработчик с кодом C и посмотреть, работает ли это, но я предпочитаю чистый ответ Python, если это вообще возможно.
Идеи?
(Я не программист, я действительно не в себе :p)
Тестовый код ниже...
import os
import sys
import time
import signal
def SigTest(SIG, FRM):
print "SIGINT Caught"
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"
signal.signal(signal.SIGHUP, SigTest)
while True:
time.sleep(5.0)