Sobes.tech
Middle+

Co je long killer?

sobes.tech AI

Odpověď od AI

Long Killer – uživatelský skript v systému Unix/Linux určený k vyhledávání a nucenému ukončení procesů, které běží déle než stanovenou dobu. Obvykle se používá k řízení zdrojů a prevenci zamrznutí systému. Může být implementován v různých skriptovacích jazycích, jako je Bash nebo Python.

Princip fungování:

  1. Určení seznamu spuštěných procesů (například pomocí ps).
  2. Filtrace procesů podle různých kritérií (uživatel, název příkazu atd.).
  3. Určení doby běhu každého zájmového procesu.
  4. Porovnání doby běhu s předem stanovenou prahovou hodnotou.
  5. Odeslání signálu ukončení (například SIGTERM nebo SIGKILL) procesům, které překročily práh.

Příklad implementace v Bash:

#!/bin/bash

# Prahový čas v sekundách
THRESHOLD_SECONDS=3600 # 1 hodina

# Název procesu k hledání. Nechte prázdné '', pokud chcete hledat všechny procesy uživatele
PROCESS_NAME=""

# Uživatel, od jehož jména jsou procesy spuštěny. Nechte prázdné '', pokud chcete hledat všechny uživatele
USER=""

# Vynechat procesy podle názvu (oddělené mezerou)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Získání seznamu procesů, jejich doby běhu (ET), PID, název příkazu a uživatele
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Převod doby běhu na sekundy
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Dny-hodiny:minuty:vteřiny
        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 # Hodiny:minuty:vteřiny
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Minuty:vteřiny
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Vteřiny
        SECS=${BASH_REMATCH[1]}
    fi

    # Kontrola podmínek pro ukončení
    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

    # Kontrola seznamu výjimek
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Ukončení procesu, pokud jsou splněny všechny podmínky a nejde o tento skript
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Ukončuji proces $PID ($CMD) běžící $ET"
        kill $PID # Může být použit kill -9 $PID pro nucené ukončení
    fi
done

Tento skript lze spouštět naplánovaně, například přes Crontab.

# Spouštět každou minutu
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Je důležité pečlivě nastavit kritéria a prahové hodnoty, aby nedošlo k neúmyslnému ukončení důležitých systémových procesů.