如何杀死一个不断重生的进程,而不杀死它的监视器进程?

fûX*_*fûX 3 process kill

有没有办法将进程放在 Linux 中的某种“黑名单”上?

Gil*_*il' 13

通常的方法是更改​​监视器程序的配置,以便它不会继续做您不希望它做的事情。我假设您出于某种原因不能这样做,但其他任何方法都是一种在所有情况下都不起作用的解决方法。

您不能将进程列入黑名单:进程是运行时实体。该进程在启动之前不存在。一旦开始,阻止它开始就为时已晚。无论如何,您将如何确定不应该开始的流程?

您可以将某个程序,或更准确地说,将某个程序的特定安装列入黑名单。所有程序都从一个可执行文件启动。所以如果你安排可执行文件不存在,它就不会启动。你可以删除它,重命名它,甚至只是让它不可执行:

chmod a-x /path/to/program
Run Code Online (Sandbox Code Playgroud)

如果您出于某种原因不想或不能修改文件系统,但具有 root 访问权限,您甚至可以使用安全框架(例如 SELinux 或 AppArmor)来禁止监视器执行此特定程序。但这更复杂。

但是,如果监视器不断尝试重新生成该程序,那么如果可执行文件消失,它可能会也可能不会明智地应对。它可能会向您发送垃圾邮件(或一些带有错误消息的日志文件)。

假设该显示器只保持程序活着(相对于检查程序的功能,例如为Web服务器进程监视器会定期尝试访问一个网页,如果没有响应,请重新启动服务器),可以取代的由一个除了永远阻塞什么都不做的程序来编程。基本实用程序集合中没有执行此操作的程序,但您可以轻松编写一个程序:

#!/bin/sh
while sleep 999999999; do :; done
Run Code Online (Sandbox Code Playgroud)

根据你为什么要阻止该程序,你可能会或可能无法通过暂停原计划的过程实现了类似的结果,与pkill -STOP programnamekill -STOP 1234其中1234是进程ID。这将保持进程,但在明确恢复(使用kill -CONT)之前什么都不做。该进程不会消耗任何 CPU 时间,并且当系统需要 RAM 用于其他事情时,它的内存将被换出,但它确实会继续消耗资源,例如打开的文件。


jll*_*gre 6

我建议尝试冷冻它而不是杀死它。取决于它的监控过程如何处理它,这可能就足够了。

kill -STOP <pid>
Run Code Online (Sandbox Code Playgroud)


Ger*_*lle 5

一种可靠的方法是重命名该程序,然后再将其杀死一次。当它可以再次运行时,将其恢复为原来的名称。