Killing todos os processos do usuário atual

4

user@host$ killall -9 -u user

Matará definitivamente todos os processos pertencentes a user (incluindo forkbombs)?

  1. Nenhum novo processo é gerado para user de outros usuários.
  2. Nenhum processo de user está em suspensão D e não pode ser martelado.
  3. Nenhum processo está tentando detectar e ptrace ou finalizar este killall iniciado (mas eles podem rastrear ou fazer outras coisas um com o outro)
  4. Existe ulimit que evita muitos processos (mas killall já foi iniciado e alocado à sua memória)

Por exemplo Se killall terminará descontrolado e com êxito é 100% que nenhum processo é deixado com este uid? Se não, como fazê-lo corretamente (com comandos padrão e sem acesso root).

O SysRq + I definitivamente matará todas as coisas (até mesmo replicando)?

    
por Vi. 15.06.2010 / 03:31

2 respostas

3

Não. killall first lista todos os processos que devem ser eliminados, e depois percorre essa lista e os mata. Se você tiver uma forkbomb em execução, depois que killall matar um de seus processos, é muito provável que outro processo recupere imediatamente o PID que acabou de ser liberado, mas killall acha que já matou esse processo, então nada acontecerá .

Você deve usar ulimit se um forkbomb for um problema para você. Limite o número de processos para, por exemplo, 128, e uma forkbomb irá morrer silenciosamente ou parar de expandir, dependendo de como foi escrito. De qualquer forma, não apresentará qualquer perigo para outros usuários desse sistema.

    
por 15.06.2010 / 06:52
0

Recentemente tive que lidar com muitos forkbombs em um servidor CTF de acesso público. Eu já tinha ulimits no lugar com pam_limits. Para a maioria dos forkbombs, você pode fazer isso:

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

O sinal STOP congela os processos, então killall tem a chance de listar todos eles e matá-los.

Mas para forkbombs típicos de python, assim que os ulimits forem atingidos, o processo de bifurcação sairá com uma exceção. Isso significa que se o seu ulimit no nproc for 500, você terá um estado estável de cerca de 500 processos python, mas cada processo só será executado por milissegundos no máximo. Quando tentei a abordagem acima, no momento em que o killall enviou um determinado sinal python a um sinal, ele já havia saído.

A coisa mais importante que aprendi veio de 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.

Assim, isso provavelmente fará o que você deseja:

killall -9 -v -g -u mallory

Alternativamente, você poderia fazer um killall -STOP e inspecionar os processos agora inativos e matá-los quando quiser. Você pode usar o sinal CONT para retomar, se desejar.

    
por 25.02.2012 / 07:49