usando monit para matar o processo correto sem saber que é PID

3

Estou tentando usar monit para encontrar processos seguros em execução por muito tempo e eliminá-los.

A máquina está executando compilações paralelas, portanto, é possível ter vários processos infalíveis ao mesmo tempo, mas não há arquivo PID para esses processos.

Minha configuração de monit é assim:

check process surefire matching "surefire/surefirebooter"
    if uptime > 4 hours then alert
    if uptime > 4 hours then stop

O alerta é enviado, mas a parada não funciona.

Eu não posso usar o killall porque o processo é executado pelo java e há vários outros processos Java em execução.

Tudo que eu preciso é detectar o PID certo desse processo para que eu possa matar o caminho certo.

    
por andrej 26.06.2014 / 13:36

2 respostas

5

há uma variável de ambiente MONIT_PROCESS_PID propagada no contexto do programa executado pelo comando exec.

if uptime > 4 hours then stop

deve ser substituído por

if uptime > 4 hours then exec "/usr/bin/monit-kill-process.sh"

e o /usr/bin/monit-kill-process.sh deve ser parecido com

#!/bin/bash
# script run from monit instance
# this will find long-running surefire process and kill it

kill -9 $MONIT_PROCESS_PID

O único problema é que o monit não é a ferramenta certa para este trabalho, pois ele quer que o processo que corresponde ao padrão check seja encontrado toda vez que ele executa a verificação, caso contrário ele tenta iniciar o processo usando start parte da definição de verificação (que não é exatamente o que queremos fazer).

Então eu encontrei e modifiquei este ps / grep / perl / xargs oneliner que eu corro através do cron. É capaz de encontrar processos por sua substring de linha de comando, selecionar os de longa duração e tratá-los bem.

#!/bin/bash
# script run from monit instance
# this will find long-running surefire process and kill it

readonly PROCESS_STRING="surefireboot"

/bin/ps -e -o pid,time,command \
 | /bin/grep $PROCESS_STRING \
 | /usr/bin/perl -ne 'print "$1 " if /^\s*([0-9]+) ([-0-9]+:[0-9]+:[0-9]+)/ && $2 gt "04:00:00"' \
 | /usr/bin/xargs kill
    
por 27.06.2014 / 11:53
0

Monit pode não ser a ferramenta certa para isso. A correspondência de padrões usa apenas a primeira correspondência.

Isso pode ser testado com monit procmatch <pattern>

Sugiro marcar suas construções com um identificador exclusivo e usá-las na sequência de correspondência de padrões ... Ou gerenciar o daemon totalmente com o monit.

Você não precisa usar killall também. Talvez alguma lógica em torno do pkill ou pgrep.

Veja também: monit: verifique o processo sem o pidfile

    
por 26.06.2014 / 15:59

Tags