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:
- Çalışan işlemlerin listesi belirlenir (örneğin,
pskomutuyla). - İşlemler çeşitli kriterlere göre filtrelenir (kullanıcı, komut adı vb.).
- Her ilgilenilen işlemin çalışma süresi belirlenir.
- Bu süre, önceden tanımlanmış eşik değeriyle karşılaştırılır.
- Eşik değeri aşan işlemlere sonlandırma sinyali (örneğin,
SIGTERMveyaSIGKILL) 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.