如何在linux上同步杀死进程
当我在进程上调用kill()时,它会立即返回,因为它只是发送一个信号.我有一个代码,我在一个循环中无限地检查一些(外来的,不是由我编写或可修改的)进程,如果它们超过某些限制(太多ram吃掉等)它会杀死它们(并写入系统日志等).
问题是,当进程被大量交换时,它需要很多秒才能终止它们,因此,我的进程多次对相同进程执行相同的检查,并尝试多次向同一进程发送信号,并将其写入syslog同样. (这不是故意的,只是我试图解决的副作用) 我不关心它发送信号的次数,但我关心它写入syslog的次数.我可以保留一个已经发送了杀死信号的PID列表,但理论上,即使可能性很低,也可能会有另一个进程产生与先前被杀死的pid相同的pid,这也可能被认为是被杀死的在这种情况下,日志将丢失. 我不知道是否有任何进程的唯一标识符,但我对此表示怀疑.我怎么能同步杀死一个进程,或者跟踪获得信号的进程并且不需要再次记录? 解决方法
即使你可以进行“同步杀戮”,你仍然有竞争条件,你可以杀死错误的进程.只要您想要杀死的进程在您看到它之后但在您杀死之前通过自己的意志或第三方操作退出,就会发生这种情况.在此间隔期间,可以将PID分配给新进程.这个问题基本上没有解决方案. PID本质上是属于所识别过程的父节点的本地资源;任何其他过程使用PID都是竞争条件.
如果您对系统有更多控制权(例如,控制要杀死的进程的父进程),则可能存在特殊情况解决方案.可能还有(特定于Linux的)解决方案基于使用/ proc中的某些机制来避免竞争,尽管我不知道任何. 另一种解决方法可能是在目标进程上使用ptrace,就像您要调试它一样.这允许您部分“窃取”父角色,避免在您仍在使用PID时使PID失效,并允许您在进程终止时收到通知.你会做类似的事情: >检查进程信息(例如来自/ proc)以确定您要杀死它.> ptrace it,暂时停止它.>重新检查流程信息,确保您获得了想要杀死的流程.>恢复跟踪过程.>杀了它.>等待(通过waitpid)通知进程退出. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |