Middle+
რა არის long killer?
sobes.tech AI
პასუხი AI-სგან
Long Killer – Unix/Linux სისტემაში გამოყენებადი მომხმარებლის სქრიპტი, რომელიც განკუთვნილია ხანგრძლივი დროით მუშაობა პროცესების ძიებისა და ძალადობრივი დასრულებისთვის. ჩვეულებრივ გამოიყენება რესურსების მართვისა და სისტემის გაყინვის თავიდან ასაცილებლად. შეიძლება განხორციელდეს სხვადასხვა სკრიპტულ ენებზე, როგორიცაა 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
მნიშვნელოვანია კრიტერიუმებისა და ზღვართა ზუსტად დაყენება, რათა თავიდან აიცილოთ მნიშვნელოვანი სისტემური პროცესების შემთხვევითი დასრულება.