(есть ответ на этот вопрос здесь )
Я пытаюсь написать систему инициализации на основе Python для Linux, но у меня проблема с получением сигналов для моего скрипта инициализации Python. Со страницы 'man 2 kill':
The only signals that can be sent to process ID 1, the init process, are those for which init has explicitly installed signal handlers.
В моей программе на основе Python у меня есть тестовая функция и настройка обработчика сигнала для вызова этой функции:
def SigTest(SIG, FRM):
print "Caught SIGHUP!"
signal.signal(signal.SIGHUP, SigTest)
Из другого TTY (скрипт init выполняет 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)