Como você automaticamente reinicia um programa quando se aproxima do limite máximo de thread?

1

Parece haver um bug conhecido em uma ferramenta de terceiros que estou usando, o que fará com que ele "vaze" threads. Threads acabarão em um estado zumbi se tiver certos problemas de comunicação com outro programa, com esses threads nunca sendo limpos.

Como isso ocorre apenas quando ocorrem problemas de comunicação, não sei quanto tempo levará para que os encadeamentos sejam acumulados. Isso pode levar meses sem se acumular, ou pode se acumular até o limite em um hora no pior cenário dos problemas de comunicação.

Eu não posso fazer muito para impedir que os tópicos se acumulem. Como uma solução alternativa, gostaria de configurar um programa para reinicializar automaticamente o aplicativo, assim que a contagem de threads se aproximar do valor ulimit. Eu estou querendo saber qual é a melhor abordagem para fazer isso?

Eu poderia escrever um cron job que seja executado a cada hora e verificar o status do proc e fazer uma reinicialização. Existe alguma abordagem mais fácil, idealmente uma que garanta uma reinicialização assim que eu acesse o ulimit, não piora o caso de 59 minutos depois que eu atingi o limite como aconteceria com a abordagem de trabalho do cron?

    
por dsollen 28.07.2017 / 19:06

1 resposta

0

Você pode fazer isso com o utilitário crontab.

Crie um arquivo com este script nele. altere o nome do programa que você deseja monitorar.

salve o arquivo, digamos que você nomeie-o como script.sh

#!/bin/sh

MAX_THREADS=60   
PROGRAM_NAME="firefox"
PID=$(ps -A | grep $PROGRAM_NAME | sed 's/\([0-9]*\).*//')
CUR_NO_THREADS=$(cat /proc/"$PID"/status | grep Threads | tr -dc '0-9');

if [ "CUR_NO_THREADS" -ge "$MAX_THREADS" ]; 
then    
     killall $PROGRAM_NAME;
     $PROGRAM_NAME;
fi; 

agora execute o crontab como

sudo crontab -e

isso abrirá um arquivo no vim ou no nano coloque isso no arquivo

0 * * * * /path/to/script/script.sh
    
por 29.07.2017 / 22:09

Tags