我正在使用 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 的新进程。