shell script para matar automaticamente os processos que correspondem a determinados critérios

1

quando rodando top ele mostra que um par de processos tem quase 100% de uso de cpu do comando 'perl'

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 21287  simon      15   0  4141  231 5891 S  90.3  0.0  14:27.50 perl
 22545 albert      15   0 12744 1172 8321 S  99.0  0.0  20:00.58 perl
        ...
        ...

lsof -p <pid> para estimar se é um processo mal-intencionado (geralmente, em algum ponto da linha de tubulação, ele está tentando se conectar a um endereço IP externo usando uma porta local > 50000)

kill -9 <pid> para eliminar esse processo malicioso individualmente

repita o texto acima

idealmente eu gostaria de matar automaticamente processos de:

  • usuários mostrados acima
  • foram executados há mais de 15 minutos
  • mais de 90% de uso da CPU.
  • com conexão tcp de saída (se possível)

alguém tem um roteiro útil para fazer isso? obrigado!

    
por cidfenmaria 05.03.2015 / 13:36

1 resposta

1

Na verdade, eu não tenho um script à mão, mas matar esses processos mal-intencionados não fará nada para resolver o problema que você tem em primeiro lugar ... Eu acho que você é um webhost e estes são mineiros que rodam em seu VPS?

O que você pode fazer é em vez de matá-los para "matá-los de fome" usando cgroups .

Você terá contabilidade de CPU e rede e uma ferramenta chamada cgclassify . Você pode criar hierarquias flexíveis. Existe uma boa documentação para o CentOS / RHEL aqui .

Não sou especialista em detalhes, mas acho que é possível desta forma: Você cria cgroups para CPU / Memória / Rede e classifica os processos de acordo com os compartilhamentos usados usando cgclassify ou o daemon mencionado. Isso significa que os daemons cuidam de supervisionar o uso de recursos e você pode se mover, e. processos que usam a rede e uma certa quantidade de compartilhamentos de CPU em um cgroup que limita severamente o acesso da CPU e da rede ou simplesmente mata o processo (por exemplo, devido à pouca memória).

Aqui está uma apresentação com alguns detalhes .

O problema em matar esses processos a cada 15 minutos é que eles provavelmente serão recuperados instantaneamente e que eles armazenam seus recursos completos nesses 15 minutos.

Com cgroups você pode classificar certos binários seguros (por exemplo, PHP, Apache) e limitar todos os outros processos ... então usar CPU / Rede não impactará o servidor e é tão lento que não vale a pena para os usuários executarem essas tarefas Também é possível moldar os compartilhamentos de CPU de tal maneira que o processo fica mais lento quanto mais CPU estiver usando. O mesmo para a largura de banda da rede .. você pode limitar, e. todos os processos para cada usuário usar apenas 1Mbit para conexões de rede de saída ou até menos.

Você também pode usar apenas os dados contábeis dos cgroups para eliminar os processos.

Fazer isso "on the fly" parece ser outro problema, mas se o problema persistir, procure usar e modificar ulatencyd ou ferramentas semelhantes às suas necessidades. Com boas regras, isso deve cuidar de processos problemáticos mais rapidamente que 15 minutos e com alguma persistência.

    
por 05.03.2015 / 14:00