Sobes.tech
Middle+

Τι είναι το long killer;

sobes.tech AI

Απάντηση από AI

Long Killer είναι ένα προσαρμοσμένο σενάριο σε συστήματα Unix/Linux, σχεδιασμένο για την εύρεση και την αναγκαστική τερματισμό διαδικασιών που λειτουργούν περισσότερο από τον καθορισμένο χρόνο. Συνήθως χρησιμοποιείται για τη διαχείριση πόρων και την πρόληψη πάγωμα του συστήματος. Μπορεί να υλοποιηθεί σε διάφορες γλώσσες scripting, όπως Bash ή Python.

Αρχή λειτουργίας:

  1. Αναγνώριση της λίστας των ενεργών διαδικασιών (π.χ., με ps).
  2. Φιλτράρισμα των διαδικασιών βάσει διαφόρων κριτηρίων (χρήστης, όνομα εντολής κ.λπ.).
  3. Προσδιορισμός της διάρκειας κάθε ενδιαφερόμενης διαδικασίας.
  4. Σύγκριση της διάρκειας με μια προκαθορισμένη τιμή ορίου.
  5. Αποστολή σήματος τερματισμού (π.χ., SIGTERM ή SIGKILL) στις διαδικασίες που υπερβαίνουν αυτό το όριο.

Παράδειγμα υλοποίησης σε Bash:

#!/bin/bash

# Όριο χρόνου σε δευτερόλεπτα
THRESHOLD_SECONDS=3600 # 1 ώρα

# Όνομα διαδικασίας προς αναζήτηση. Αφήστε κενό '', αν θέλετε να αναζητήσετε όλες τις διαδικασίες χρήστη
PROCESS_NAME=""

# Χρήστης που τρέχει τις διαδικασίες. Αφήστε κενό '', αν θέλετε να αναζητήσετε διαδικασίες όλων των χρηστών
USER=""

# Αποκλεισμός διαδικασιών βάσει ονόματος (διαχωρισμένο με κενά)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"

# Λήψη λίστας διαδικασιών, χρόνου λειτουργίας (ET), PID, ονόματος εντολής και χρήστη
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
    # Μετατροπή χρόνου λειτουργίας σε δευτερόλεπτα
    SECS=0
    if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # Ημέρες-ώρες:λεπτά:δευτερόλεπτα
        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 # Ώρες:λεπτά:δευτερόλεπτα
        SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
    elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # Λεπτά:δευτερόλεπτα
        SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
    elif [[ "$ET" =~ ([0-9]+) ]]; then # Δευτερόλεπτα
        SECS=${BASH_REMATCH[1]}
    fi

    # Έλεγχος συνθηκών για τερματισμό
    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

    # Έλεγχος λίστας αποκλεισμού
    for EXCLUDE in $EXCLUDE_PROCESSES; do
        if [[ "$CMD" == *"$EXCLUDE"* ]]; then
            KILL=false
            break
        fi
    done

    # Τερματισμός διαδικασίας αν πληρούνται όλες οι συνθήκες και αυτό δεν είναι το τρέχον σενάριο
    if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
        echo "Τερματισμός διαδικασίας $PID ($CMD) που τρέχει για $ET"
        kill $PID # Μπορεί να χρησιμοποιηθεί kill -9 $PID για αναγκαστικό τερματισμό
    fi
done

Αυτό το σενάριο μπορεί να προγραμματιστεί να τρέχει περιοδικά, π.χ., μέσω Crontab.

# Εκτέλεση κάθε λεπτό
* * * * * /path/to/your/long_killer.sh >> /var/log/long_killer.log 2>&1

Είναι σημαντικό να ρυθμίζετε προσεκτικά τα κριτήρια και τα όρια, ώστε να αποφεύγεται η ακούσια τερματισμός σημαντικών συστημικών διαδικασιών.