Sobes.tech
Middle+

Long killer nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Long Killer, Unix/Linux sistemlerinde kullanılan, belirli bir süreyi aşan işlemleri bulup zorla sonlandırmak için tasarlanmış kullanıcı betiğidir. Genellikle kaynak yönetimi ve sistemin takılmasını önlemek amacıyla kullanılır. Bash veya Python gibi çeşitli betik dilleriyle uygulanabilir.

Çalışma prensibi:

  1. Çalışan işlemlerin listesi belirlenir (örneğin, ps komutuyla).
  2. İşlemler çeşitli kriterlere göre filtrelenir (kullanıcı, komut adı vb.).
  3. Her ilgilenilen işlemin çalışma süresi belirlenir.
  4. Bu süre, önceden tanımlanmış eşik değeriyle karşılaştırılır.
  5. Eşik değeri aşan işlemlere sonlandırma sinyali (örneğin, SIGTERM veya SIGKILL) gönderilir.

Bash ile örnek uygulama:

#!/bin/bash

# Eşik süre saniye cinsinden
THRESHOLD_SECONDS=3600 # 1 saat

# Aranacak işlem adı. Boş bırakın '', tüm kullanıcı işlemlerini aramak istiyorsanız
PROCESS_NAME=""

# İşlemleri yürüten kullanıcı. Boş bırakın '', tüm kullanıcılar için arama yapacaksanız
USER=""

# Hariç tutulacak işlemler (boşlukla ayrılmış)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# İşlem listesi, çalışma zamanı (ET), PID, komut adı ve kullanıcı bilgisi alınır
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Çalışma süresini saniyeye çevir
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Gün-saat:dakika:saniye
        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 # Saat:dakika:saniye
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Dakika:saniye
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Saniye
        SECS=${BASH_REMATCH[1]}
    fi

    # Sonlandırma koşulları
    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

    # Hariç tutma listesi
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Tüm koşullar sağlanıyorsa ve bu betik değilse işlemi sonlandır
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "İşlem $PID ($CMD) sonlandırılıyor, $ET süredir çalışıyor"
        kill $PID # Zorla sonlandırmak için kill -9 $PID kullanılabilir
    fi
done

Bu betik, örneğin Crontab aracılığıyla periyodik olarak çalıştırılabilir.

# Her dakika çalıştır
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Kriterlerin ve eşik değerlerin dikkatlice ayarlanması, önemli sistem işlemlerinin istemeden sonlandırılmasını önlemek açısından önemlidir.