如何让 linux“kill -SIG pidlist”报告它到底杀死了哪些 PID?

如何让 linux“kill -SIG pidlist”报告它到底杀死了哪些 PID?

我正在使用 Kubuntu 22.04,目前使用 KNOPPIX 9.1。

杀死-SIGSPEC pidlist

不能可靠地杀死它们,也不能报告它们杀死了哪些 PID,哪些没有杀死。

在我使用 Linux 的 30 年时间里,我总是无法知道哪些 PID 真正被杀死了,哪些没有。

有没有办法实现 kill 会输出 kill 所做的事情?

问候

安东迪德

=====

插件 28.07.2022 因为评论太长::

通常需要终止某个 PID 以下的所有进程,例如终止子 shell 及其子进程。在这种情况下,(a) 子 shell 被终止,(b) 子进程仍处于活动状态,其父进程变为不再是现在不存在的子 shell,而是 PID 1。结果是 pgerp -P 以及 ps -ppid 不再提供此处于活动状态的子进程的输出。我进行了长时间的调查和开发,才找到解决方案:(1) 根据 pstree 的输出,(2) 提取 PID,(3) 删除 pstree 中的 PID 以及要终止的进程,(4) 恢复 PID 的顺序,以便先终止子进程,然后再向上终止父进程。在大量调试输出之间显示已终止的进程和仍需终止的进程的状态。问候 antonhdidh

====

解释得很好,但我不知道还有什么工具可以像“kill”命令一样终止进程(除了一些手动执行的操作,一个接一个),因此对我来说,所有问题都是“kill”的问题

问候

安东迪德

答案1

kill不会“杀死”进程。它所做的只是发送信号,这是一个异步过程。信号的实际处理由进程或内核完成(在SIGKILL或 的情况下SIGSTOP)。因此,kill无法报告它,因为它不知道。

通常,内核会接受 SIGKILL 而不需要检查。只有在不可中断的系统调用的情况下,进程才会保留,因为内核无法中断进程已完成的系统调用。系统调用完成后,在返回之前,系统调用将检查进程是否已收到 SIGKILL 并采取适当的措施。

我不确定您使用过哪种 Unices,但自从 Solaris 8 以及我使用过的所有后续 Linux 以来,我从未见过 kill 报告它实际杀死的内容(出于上述原因)。

这个答案在Unix和Linux上对该过程有一些很好的细节。


是否可以验证 SIGKILL 是否确实完成了其工作?当然,您可以编写一个 shell 脚本包装器来kill验证进程是否消失,以下几行代码相当可靠:

  • 检查指定PID的参数来唯一地标识该进程(/proc/cwd,,,也许还有其他)/proc/exe/proc/environ
  • 发送SIGKILL
  • 检查 PID 是否消失。如果没有,请检查上面保存的参数,看看当前 PID 是否恰好是具有相同 PID 的新进程。

相关内容