杀死当前用户的所有进程

杀死当前用户的所有进程

user@host$ killall -9 -u user

它一定会杀死所有拥有的进程user(包括forkbombs)吗?

  1. 没有来自user其他用户的新进程。
  2. Nouser的进程处于 D 级睡眠状态且无法终止。
  3. 没有进程试图检测或ptrace终止此启动killall(但它们可以 ptrace 或相互执行其他操作)
  4. 可以ulimit防止过多的进程(但killall已经启动并分配了内存)

例如,如果killall能够成功完成且不被篡改,那么是否 100% 表示没有进程保留此 uid?如果不是,如何正确执行(使用标准命令且无 root 访问权限)。

SysRq+I 一定会杀死所有东西(甚至复制的东西)吗?

答案1

第一名killall列出所有进程要被杀死的进程,然后遍历该列表并杀死它们。如果您正在运行 forkbomb,在killall杀死其中一个进程之后,另一个进程很可能会立即回收刚刚释放的 PID,但killall会认为它已经杀死了该进程,因此实际上什么也不会发生。

你应该使用限制如果 forkbomb 对您来说是个问题。将进程数限制为例如 128,forkbomb 就会默默地死亡或停止扩展,具体取决于它的编写方式。无论如何,它不会对该系统的其他用户造成任何危险。

答案2

我最近不得不处理一个可公开访问的 CTF 服务器上的许多 forkbomb。我已经使用 pam_limits 设置了 ulimit。对于大多数 forkbomb,您可以执行以下操作:

killall -v -STOP -u mallory; killall -v -9 -u mallory

STOP 信号冻结了进程,因此 killall 有机会列出所有进程并将其杀死。

但对于典型的 python forkbombs,一旦达到 ulimits,fork 进程就会异常退出。这意味着,如果 nproc 上的 ulimit 为 500,则 python 进程将稳定在 500 个左右,但每个进程最多只能运行几毫秒。当我尝试上述方法时,当 killall 向任何给定的 python 进程发送信号时,它已经退出了。

我学到的最重要的东西来自killall(1)

   -g, --process-group
          Kill the process group to which the process  belongs.  The  kill
          signal  is  only sent once per group, even if multiple processes
          belonging to the same process group were found.

因此,这可能会实现您想要的效果:

killall -9 -v -g -u mallory

或者,您可以改为执行killall -STOP并检查现在处于静止状态的进程,并在空闲时终止它们。CONT如果需要,您可以使用信号来恢复它们。

相关内容