Linux:终止一系列进程的最可靠方法

时间:2015-06-22 12:39:14

标签: linux bash process terminate

如果我们假设:

,在Linux中终止一系列进程的最佳方法是什么?
    在我们开始清理之前,
  1. 家庭中的任意进程可能会被杀死/终止;因此,如果子进程未终止,则其PPID将为1
  2. 流程可以更改流程组
  3. 我正在看的特定场景是Bash,但更通用的技术越好。

1 个答案:

答案 0 :(得分:2)

您可能希望在不同的登录shell中执行查杀(最终通过脚本),以确保您在完成其工作之前不会意外停止/终止尝试执行整体查杀的shell /脚本:)< / p>

第一个关键策略是不直接终止流程,而是:

一旦基于ppid的整个祖先树被冻结,你就可以根据进程组开始定位和冻结祖先 - 只要改变进程组的进程的父进程仍然存活,你仍然可以可靠地确定这些进程组(因为它们的ppid没有改变) - 将这些组添加到要被修复的pgid列表中,并冻结您在这些组中可能找到的任何新的基于ppid的进程子树,如上所述:

  • 如果他们的父母还活着,他们应该被冻结 他们在冷冻的基于ppid的祖先树
  • 如果他们是孤儿,他们将在整个pgid被杀害时被杀死

会话ID可以通过非常类似于基于组ID的方式发现相关进程(除了需要通过pid进行查杀,因为kill cmd支持组ID而不是会话ID)。

找到可能相关的流程的另一种方法是通过他们的tty,如果他们有一个。但是要小心 - 他们可能不是你要杀死的过程的后代,而是祖先或者s ..在调查时,您仍然可以冻结以此方式找到的基于ppid的子树和组 - 如果不需要被杀死,您可以随后“解冻”它们(使用kill -CONT)。

我不知道如何找到后代进程子树,这些子进程通过声明自己的会话负责人(因此改变他们的sid和pgid)的进程解耦,如果他们的父母去世并且他们没有pty。

一旦整个子树列表被冻结,可以杀死进程(根据需要通过pid或pgid)或解冻以在需要时继续工作。