Como matar todos os processos para um determinado usuário que demoram mais que X time

2

Quando eu listo processos com ps auxf , muitas vezes vejo alguns que estão presos e eu preciso matá-los manualmente. Como posso fazer isso com um comando?

Exemplo de resultado ps:

$ ps auxf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME     COMMAND
tommass   7971 62.3  1.1 316428 45844 ?        R    Aug08 29133:14  xxxxxxxx
tommass   7978  0.0  2.6 455072 105964 ?       S    Aug08   8:56    xxxxxxxx
tommass   7979  0.0  2.6 454436 105360 ?       S    Aug08   8:57    xxxxxxxx
tommass  15034 67.8  1.1  51828 43760 ?        R    Aug14 26411:38  xxxxxxxx
tommass   7982  0.0  2.6 455012 105904 ?       S    Aug08   8:28    xxxxxxxx
  1. Como posso matar todos os processos de um determinado usuário "tommass" que demoram mais de 1 hora
  2. Como posso matar todos os processos para um determinado usuário "tommass" cujo STAT é "R"
por Cyprian 10.09.2014 / 07:01

2 respostas

1

para responder 1), comece com

ps -u tomass -o pid,time 

(dependendo do seu contexto, você pode querer selecionar o tempo (cpu time), etime (tempo decorrido))

para responder 2), tente

ps -u tomass -o state,pid | awk '$1 == "R" { printf "kill %d\n",$2 ;}' | ksh

Você realmente quer matar o processo de execução?

    
por 10.09.2014 / 14:28
2

Existem várias maneiras de fazer isso.

  1. Defina um limite de tempo de CPU nos processos do usuário usando pam_limits.so e /etc/secrity/limits.conf . Isso fará com que os processos que ultrapassam a cota de tempo da CPU recebam um sinal XCPU; se eles não bloquearem / ignorarem / manipularem especificamente, isso fará com que eles saiam.

  2. Use o Auto Nice Daemon (pacote and no Debian / Ubuntu). Ele renegará e / ou eliminará processos que usam muito tempo de CPU.

  3. Deve ser possível hackear um script que chame ps(1) com um argumento de string de formato que faça com que ele imprima somente os campos que lhe interessam (ex .: cpu time, username, pid) e processe essa saída usando um shellscript como grep -f file-with-one-username-per-line | while read cputime username pid; do [ "$cputime" -gt max-cpu-time ] && kill -9 $pid; done , mas isso seria reinventar o Auto Nice Daemon.

por 10.09.2014 / 14:18