Middle+
O que é um long killer?
sobes.tech IA
Resposta da IA
Long Killer é um script personalizado em sistemas Unix/Linux, concebido para procurar e terminar processos que funcionam por mais tempo do que o definido. Geralmente é usado para gerir recursos e evitar bloqueios do sistema. Pode ser implementado em várias linguagens de scripting, como Bash ou Python.
Princípio de funcionamento:
- Identificação da lista de processos em execução (por exemplo, usando
ps). - Filtragem de processos com base em diferentes critérios (utilizador, nome do comando, etc.).
- Determinação da duração de cada processo de interesse.
- Comparação da duração com um valor limite predefinido.
- Envio de um sinal de terminação (por exemplo,
SIGTERMouSIGKILL) aos processos que excederem esse limite.
Exemplo de implementação em Bash:
#!/bin/bash
# Tempo limite em segundos
THRESHOLD_SECONDS=3600 # 1 hora
# Nome do processo a procurar. Deixe vazio '', se desejar procurar todos os processos do utilizador
PROCESS_NAME=""
# Utilizador que executa os processos. Deixe vazio '', se desejar procurar processos de todos os utilizadores
USER=""
# Excluir processos por nome (separados por espaços)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Obter a lista de processos, o tempo de execução (ET), PID, nome do comando e utilizador
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Converter tempo de execução em segundos
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dias-horas:minutos:segundos
SECS=$(( ${BASH_REMATCH[1]}*86400 + ${BASH_REMATCH[2]}*3600 + ${BASH_REMATCH[3]}*60 + ${BASH_REMATCH[4]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+):([0-9]+) ]]; then # Horas:minutos:segundos
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minutos:segundos
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # Segundos
SECS=${BASH_REMATCH[1]}
fi
# Verificar condições para terminar
KILL=false
if [ "$SECS" -gt "$THRESHOLD_SECONDS" ]; then
KILL=true
fi
if [ -n "$PROCESS_NAME" ] && [[ ! "$CMD" =~ "$PROCESS_NAME" ]]; then
KILL=false
fi
if [ -n "$USER" ] && [ "$USER_NAME" != "$USER" ]; then
KILL=false
fi
# Verificar lista de exclusão
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Terminar processo se todas as condições forem atendidas e não for este script
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Matando processo $PID ($CMD) que funciona há $ET"
kill $PID # Pode usar kill -9 $PID para forçar a terminação
fi
done
Este script pode ser agendado para execução periódica, por exemplo, via Crontab.
# Executar a cada minuto
* * * * * /caminho/para/o/seu/long_killer.sh >> /var/log/long_killer.log 2>&1
É importante ajustar cuidadosamente os critérios e limites para evitar terminar processos importantes do sistema de forma não intencional.