我有一个像这样工作的多进程应用程序......
有一个父进程。父进程查询数据库以查找工作,然后派生子进程来处理该工作。孩子们通过 System V 消息队列与父母交流,以表明他们已经完成了他们的工作。当父进程接收到该消息时,它会更新数据库以指示工作已完成。
这工作正常,但我正在努力处理被杀死的父进程。
发生的情况是父母收到一个 SIGINT(来自 CTRL-C),然后向每个孩子发送 SIGKILL。如果子进程在接收到该信号时正在阻塞 Sys V 消息队列写入,则写入被信号“中断”并且阻塞取消,并且父进程永远不会知道子进程的工作已经完成,并且数据库永远不会更新.
这意味着下次我运行脚本时,它将重新运行任何阻塞在 System V 队列写入上的工作。
我还没有一个解决方案的好主意。理想情况下,我希望能够强制队列写入保持阻塞状态,即使它收到 SIGKILL 但我认为这样的事情是不可能的。