Middle+
Czym jest long killer?
sobes.tech AI
Odpowiedź od AI
Long Killer to niestandardowy skrypt w systemach Unix/Linux, zaprojektowany do wyszukiwania i wymuszania zakończenia procesów działających dłużej niż określony czas. Zazwyczaj służy do zarządzania zasobami i zapobiegania zawieszaniu się systemu. Może być zaimplementowany w różnych językach skryptowych, takich jak Bash czy Python.
Zasada działania:
- Identyfikacja listy uruchomionych procesów (np. za pomocą
ps). - Filtrowanie procesów według różnych kryteriów (użytkownik, nazwa polecenia itp.).
- Określenie czasu działania każdego interesującego procesu.
- Porównanie czasu działania z wcześniej zdefiniowanym progiem.
- Wysłanie sygnału zakończenia (np.
SIGTERMlubSIGKILL) procesom przekraczającym ten próg.
Przykład implementacji w Bash:
#!/bin/bash
# Próg czasowy w sekundach
THRESHOLD_SECONDS=3600 # 1 godzina
# Nazwa procesu do wyszukania. Pozostaw puste '', jeśli chcesz szukać wszystkich procesów użytkownika
PROCESS_NAME=""
# Użytkownik uruchamiający procesy. Pozostaw puste '', jeśli chcesz szukać procesów wszystkich użytkowników
USER=""
# Wykluczenie procesów po nazwie (oddzielone spacjami)
EXCLUDE_PROCESSES="sshd bash long_killer.sh"
# Pobieranie listy procesów, ich czasu działania (ET), PID, nazwy polecenia i użytkownika
ps -eo etime,pid,cmd,user --no-headers | while read ET PID CMD USER_NAME; do
# Konwersja czasu działania na sekundy
SECS=0
if [[ "$ET" =~ ([0-9]+)-([0-9]+):([0-9]+):([0-9]+) ]]; then # dni-hh:mm:ss
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 # hh:mm:ss
SECS=$(( ${BASH_REMATCH[1]}*3600 + ${BASH_REMATCH[2]}*60 + ${BASH_REMATCH[3]} ))
elif [[ "$ET" =~ ([0-9]+):([0-9]+) ]]; then # mm:ss
SECS=$(( ${BASH_REMATCH[1]}*60 + ${BASH_REMATCH[2]} ))
elif [[ "$ET" =~ ([0-9]+) ]]; then # sekundy
SECS=${BASH_REMATCH[1]}
fi
# Sprawdzanie warunków do zakończenia
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
# Sprawdzanie listy wykluczeń
for EXCLUDE in $EXCLUDE_PROCESSES; do
if [[ "$CMD" == *"$EXCLUDE"* ]]; then
KILL=false
break
fi
done
# Zakończenie procesu, jeśli wszystkie warunki są spełnione i to nie jest ten skrypt
if [ "$KILL" = true ] && [ "$PID" != "$$" ]; then
echo "Zabijanie procesu $PID ($CMD) działającego od $ET"
kill $PID # Można użyć kill -9 $PID do wymuszenia zakończenia
fi
done
Skrypt można uruchamiać cyklicznie, np. za pomocą Crontab.
# Uruchamiać co minutę
* * * * * /ścieżka/do/twojego/long_killer.sh >> /var/log/long_killer.log 2>&1
Ważne jest, aby starannie dostosować kryteria i progi, aby uniknąć niezamierzonego zakończenia ważnych procesów systemowych.