Middle+
Τι είναι το long killer;
sobes.tech AI
Απάντηση από AI
Long Killer είναι ένα προσαρμοσμένο σενάριο σε συστήματα Unix/Linux, σχεδιασμένο για την εύρεση και την αναγκαστική τερματισμό διαδικασιών που λειτουργούν περισσότερο από τον καθορισμένο χρόνο. Συνήθως χρησιμοποιείται για τη διαχείριση πόρων και την πρόληψη πάγωμα του συστήματος. Μπορεί να υλοποιηθεί σε διάφορες γλώσσες scripting, όπως Bash ή Python.
Αρχή λειτουργίας:
- Αναγνώριση της λίστας των ενεργών διαδικασιών (π.χ., με
ps). - Φιλτράρισμα των διαδικασιών βάσει διαφόρων κριτηρίων (χρήστης, όνομα εντολής κ.λπ.).
- Προσδιορισμός της διάρκειας κάθε ενδιαφερόμενης διαδικασίας.
- Σύγκριση της διάρκειας με μια προκαθορισμένη τιμή ορίου.
- Αποστολή σήματος τερματισμού (π.χ.,
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
Είναι σημαντικό να ρυθμίζετε προσεκτικά τα κριτήρια και τα όρια, ώστε να αποφεύγεται η ακούσια τερματισμός σημαντικών συστημικών διαδικασιών.