這是我的其他職位Installing signal handler with Python的後續行動。簡而言之,除非Init爲特定信號安裝了信號處理程序,否則Linux將阻止所有信號到PID 1(包括SIGKILL);以防止有人將終止信號發送到PID1時發生內核恐慌。我一直有的問題是,Python中的signal
模塊似乎沒有以系統識別的方式安裝信號處理程序。我的Python Init腳本似乎完全忽略了所有信號,因爲我認爲它們被阻止。Linux阻止信號到Python初始化
我似乎找到了解決辦法;使用在libc中安裝帶signal()
函數的信號處理程序(在本例中爲uClibc)。下面是一個基於python的測試init。它在TTY2上打開一個shell,從中我可以發送信號到PID1進行測試。它似乎在用於測試的KVM im中工作(我願意與任何感興趣的人共享虛擬機)
這是解決此問題的最佳方法嗎?在沒有信號模塊的情況下安裝信號處理器有沒有更好的方法? (我一點也不關心)
這是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)
這實際上屬於codereview.SE,但是對於在Python中實現'init'的酷想法+1。 – 2011-04-30 20:25:17
我認爲這可能是我應該發佈的地方,但我沒有設置這種做法,並認爲可能有很多想法我沒有想過。 – tMC 2011-04-30 20:30:45