今天寫個常駐服務(wù),使用了multiprocessing庫,新的process設(shè)置了daemon屬性旁振,想通過signal來主動關(guān)閉服務(wù),主進(jìn)程進(jìn)行了信號綁定,代碼如下:
def handler(signum, frame):
logger.info("got signal:%d" % signum)
global quit
quit = True
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)
這樣設(shè)置后规求,發(fā)現(xiàn)Ctrl+C后筐付,父子進(jìn)程均收到了信號卵惦,但是子進(jìn)程并沒有終止阻肿,父進(jìn)程也hang住了。
查看日志沮尿,發(fā)現(xiàn)在子進(jìn)程收到signum為2(signal.SIGINT)的信號后丛塌,又收到了15(signal.SIGTERM),這說明daemon屬性設(shè)置是為了父進(jìn)程往子進(jìn)程發(fā)送15的信號畜疾,但是如果15也被主動捕獲了赴邻,導(dǎo)致默認(rèn)處理15的退出邏輯并沒有再執(zhí)行,而父進(jìn)程沒有收到子進(jìn)程的退出狀態(tài)啡捶,也hang住了姥敛,將15的捕獲刪除后,符合預(yù)期瞎暑。