Sobes.tech
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:

  1. Identificação da lista de processos em execução (por exemplo, usando ps).
  2. Filtragem de processos com base em diferentes critérios (utilizador, nome do comando, etc.).
  3. Determinação da duração de cada processo de interesse.
  4. Comparação da duração com um valor limite predefinido.
  5. Envio de um sinal de terminação (por exemplo, SIGTERM ou SIGKILL) 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.