Encontre (e mate) processos antigos

10

Basicamente eu preciso ser capaz de escanear a árvore de processos e encontrar processos que correspondam a um certo nome e comecei a correr a mais de uma semana. Depois de tê-los, preciso matá-los. Todos os processos ainda são vistos em estado de execução pelo sistema, simplesmente não usando nenhum horário do sistema. Eles geralmente ficam sentados para sempre nesse estado também.

Idealmente, gostaria de algo semelhante para encontrar, mas para processos.

O sistema é Debian linux e este será roteirizado e executado pelo cron, então não tenho problemas reais com algo grande, mas compreensível.

    
por Ryaner 05.10.2009 / 16:32

6 respostas

9

Você pode fazer isso com uma combinação de ps, awk e kill:

ps -eo pid,etime,comm

Fornece uma saída de três colunas, com o PID do processo, o tempo decorrido desde o início do processo e o nome do comando, sem argumentos. O tempo decorrido parece com um desses:

mm:ss
hh:mm:ss
d-hh:mm:ss

Como você quer que os processos estejam em execução há mais de uma semana, procure por linhas que correspondam ao terceiro padrão. Você pode usar o awk para filtrar os processos por tempo de execução e pelo nome do comando, assim:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }'

que irá imprimir os pids de todos os comandos correspondentes a 'mycommand' que estão em execução há mais de 7 dias. Pipe essa lista para matar e pronto:

ps -eo pid,etime,comm | awk '$2~/^7-/ && $3~/mycommand/ { print $1 }' | kill -9
    
por 05.10.2009 / 17:25
3

killall --quiet --older-than 1w process_name

    
por 15.04.2016 / 23:00
1

Todas as informações de que você precisa podem ser obtidas de ps -ef . Veja a coluna "STIME". Combine isso com grep para classificar os processos que você precisa. Nesse ponto, você pode usar cut para pegar o pid de todos os processos correspondentes e passá-los para kill .

Por favor, deixe-me saber se você gostaria de mais detalhes sobre como fazer isso.

    
por 05.10.2009 / 16:45
1

se você é root, para se livrar do lixo (/ proc / fs proc / stat ...)

find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mtime +2 -exec basename {} \;
    
por 07.10.2010 / 18:27
0

Quando um processo é iniciado, ele cria um diretório no sistema de arquivos / proc. Você pode usar o comando find para obter diretórios com mais de 7 dias e eliminar os processos da seguinte forma:

find /proc -user myuser -maxdepth 1 -type d -mtime +7 -exec basename {} \; | xargs kill -9 
    
por 05.10.2009 / 16:47
0

Ninguém mencionou o ps-watcher aqui. Acho que você pode comparar $ start_time usando a função elapsed2sec, mas não tenho certeza. Aqui está meu primeiro pensamento:

[myproc]
occurs = every
trigger = elapsed2secs('$start_time') > 7*DAYS
action = <<EOT
  echo "$command has been running more than 7 days" | /bin/mail user\@host
  kill -TERM $pid
EOT

não faz ideia se isso funciona, mas deve ser um bom ponto de partida.

    
por 23.01.2011 / 21:04