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

Tom*_*mek 2 linux bash process terminate

如果我们假设:在 Linux 中终止一系列进程的最佳方法是什么:

  1. 在我们开始清理之前,家族中的任意进程都可能被杀死/终止;因此,如果子进程不终止,它们的 PPID 将为 1
  2. 进程可以更改进程组

我正在研究的特定场景是 Bash,但技术越通用越好。

Dan*_*scu 5

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

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

一旦基于 ppid 的整个祖先树被冻结,您就可以开始根据进程组查找和冻结祖先 - 只要更改其进程组的进程的父进程仍然存在,您仍然可以可靠地确定这些进程组(因为它们的 ppid未更改) - 将这些组添加到要核化的 pgids 列表中,并冻结您可能在这些组中找到的任何新的基于 ppid 的进程子树,如下所示:

  • 如果他们的父母还活着,他们应该已经被冻结,因为他们位于基于 ppid 的冻结祖先树中
  • 如果他们是孤儿,当整个 pgid 被核武器摧毁时,他们就会被杀死

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

查找潜在相关进程的另一种方法是通过它们的 tty(如果有的话)。但要小心 - 它们可能不是您想要杀死的进程的后代,而是祖先或兄弟姐妹。您仍然可以在调查时冻结以这种方式找到的基于 ppid 的子树和组 -kill -CONT如果不需要杀死它们,您可以稍后“解冻”它们(使用 )。

如果它们的父母去世并且没有 pty,我不知道如何找到由声明自己为会话领导者的进程解耦的后代进程子树(从而更改其 sid 和 pgid)。

一旦整个子树列表被冻结,进程就可以被终止(根据需要通过 pid 或 pgid)或解冻以继续其工作(如果需要)。