杀死当前用户的所有进程


4

user@host$ killall -9 -u user

它肯定会杀死所有拥有的进程user(包括前炸弹)吗?

  1. 没有user其他用户产生任何新进程。
  2. No user的进程处于D睡眠状态且无法杀死。
  3. 没有进程尝试检测ptrace或终止已启动的进程killall(但是它们可以相互跟踪或执行其他操作)
  4. ulimit防止过多的流程(但killall已启动,并分配它的内存)

例如,是否killall将不受干扰地成功完成,是否没有100%的进程剩余此uid?如果不是,如何正确执行操作(使用标准命令且无root访问权限)。

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

Answers:


3

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

如果前炸弹对您来说是个问题,则应使用ulimit。将进程数限制为例如128个,并且前炸弹将静默地死掉或停止扩展,这取决于它的编写方式。无论如何,它不会对该系统的其他用户造成任何危险。


ulimit当然已经用于来宾帐户。当它运行时ulimit (如何使用同一帐户)如何停止一个前哨炸弹?
六。

1
来自同一个帐户?killall如果将所有pid分配给forkbomb,您将如何启动?如果可以的话,请先这样做killall -STOP -u user,以防止炸弹扩散,然后再使用杀死炸弹killall -9 -u user
whitequark 2010年

当然,如果您确实想要并且可以通过同一帐户执行此操作,则必须以某种方式告诉killall您不要停止外壳程序(可能停止自我操作)。
whitequark 2010年

1
男子杀人:killall process never kills itself (but may kill other killall processes).
六。

@Vi:啊,那真是愚蠢。但是外壳问题仍然出现。
whitequark 2010年

0

最近,我不得不在可公开访问的CTF服务器上处理许多分支。我已经在pam_limits中设置了ulimit。对于大多数前炸弹,您可以执行以下操作:

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

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

但是对于典型的python forkbombs,只要达到ulimits,分支过程就会异常退出。这意味着,如果您在nproc上的ulimit为500,则您将拥有大约500个python进程的稳定状态,但是每个进程最多只能运行几毫秒。当我尝试上述方法时,当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如果需要,您可以使用信号恢复它们。


在终止之前停止进程是一个好主意(因为它阻止了资源回收和产生新进程)。只需注意不要释放自己的外壳(我们正在清理无根访问权限的前炸弹)
Vi。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.