我有一个多进程应用程序,就像这样......
有一个父进程。父进程查询数据库以查找工作,然后让子进程处理该工作。孩子们通过System V消息队列与父母进行通信,以表明他们已经完成了他们的工作。当父进程选择该消息时,它会更新数据库以指示工作已完成。
这没关系,但我正在努力处理被杀的父进程。
父进程收到SIGINT(来自CTRL-C),然后将SIGKILL发送给每个子进程。如果一个孩子当前在Sys V消息队列中阻塞,当它收到该信号时写入,写入被信号“中断”并且阻塞被取消,父母从未得知孩子的工作已完成,并且数据库永远不会更新
这意味着下次运行脚本时,它将重新运行在System V队列写入时阻塞的任何工作。
我还没有一个好主意来解决这个问题。理想情况下,我希望能够强制队列写入保持阻塞,即使它收到SIGKILL但我不认为这样的事情是可能的。
答案 0 :(得分:0)
根据定义,SIGKILL
对于接收它并且不能被捕获或处理的过程立即致命。
这就是为什么当流程没有响应更多有礼貌的关闭请求时,你应该只将它作为最后的手段。您的父进程应首先向子项发送SIGINT
或SIGTERM
之类的内容,如果未在合理的时间内退出,则仅重置为SIGKILL
。
SIGINT
和SIGTERM
之类的信号可能仍会导致子系统中的系统调用返回EINTR
,但您可以处理该操作并重试调用并在退出之前完成调用