Elimine os trabalhos filho que duram mais de 20 minutos

1

Portanto, tenho alguns processos que executam tarefas em segundo plano (resque) em servidores, e alguns desses trabalhos iniciam um processo filho que ocasionalmente fica preso. Eu encontrei se eu matar esse processo filho tudo volta ao normal. Temos outro script que pode matar um processo binário se for longo, mas não parece funcionar aqui. Normalmente eu posso fazer isso:

killall --older-than 20m <process>

Mas esses trabalhadores parecem ser um pouco mais complicados. Aqui está como eles aparecem no ps:

jbsmith@server:~$ ps aux | grep resque
www-data 17652  0.0  1.8 794148 145940 ?       Sl   11:03   0:05 resque-1.26.0: Processing email since 1494525823 [Email]
www-data  1026  0.0  1.9 787712 157080 ?       Sl   10:47   0:13 resque-1.26.0: Forked 17652 at 1494525823

O "x bifurcado em x" é o processo filho e o que eu preciso matar. Existe um comando de um forro que eu possa usar para encontrar processos que talvez combinem com "Bifurcados" e mais de 20 minutos e os matem?

    
por Joel Smith 12.05.2017 / 01:14

1 resposta

1

Um "one-liner", dividido em duas linhas para menos rolagem:

ps aux | awk -v cutoff=$(( $(date +%s) - 20 * 60 ))  \
  '/resque.*Forked [0-9]+ at [0-9]+/ { if ($NF < cutoff) system("kill " $2) }'

Poderia ser reforçada usando um especificador de saída para ps para limitar a saída apenas aos campos PID e COMM e ARG, e então corresponder especificamente a COMM e ARGS, mas os riscos de uma correspondência falso-positiva parecem baixos para eu aqui.

    
por 12.05.2017 / 03:45