LinuxForum.Fans
Тема

Помогите дописать скрипт :)

Автор: servercore 8 сообщений 3730 просмотров
#346790

Привет всем. Проблема в следующем. На компьютере запущено 10 процессов. Время от времени один из них может подвиснуть. Если посмотреть top то столбик %CPU = 100
Такой зависший процесс дает лаг на работу остальных 9ти. Поэтому нужно обнаруживать его и убивать. Авторестарт у них свой, стартуют нормально.

Нашел вот такой скрипт, но не срабатывает как нужно. Может кто подскажет.

Показать

#!/bin/bash

## Note: will kill the top-most process if the $CPU_LOAD is greater than the $CPU_THRESHOLD.
echo
echo checking for run-away process ...

CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=400
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)

if [ $CPU_LOAD -gt $CPU_THRESHOLD ] ; then
# kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
# kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
kill -9 $TOPPROCESS
echo system overloading!
echo Top-most process killed $TOPPROCESS
echo load average is at $CPU_LOAD
echo
echo Active processes...
ps aux r

else
echo
echo no run-aways.
echo load average is at $CPU_LOAD
echo
echo Active processes...
ps aux r
fi
exit 0

Вроде процессы он находит нормально, но думаю определяет загрузку по не понятному мне алгоритму. Мне нужно чтобы если процессор в top = 95-100% скрипт его убивал.
Для теста пробовал запустить процесс. В top у него показывает 50% а скрипт выдает 16%
Active processes...
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 4965 16.0 0.8 317084 116304 pts/0 Rl+ 15:37 8:31 ./server_shell
root 9718 0.0 0.0 4684 960 pts/2 R+ 16:30 0:00 ps aux r

тут привязка к кол-ву ядер идет на сколько я могу судить. На компе у меня corei5 т.е. 4 полных ядра или 8 общих. Убить его этим скриптом могу только если поставить
CPU_THRESHOLD=10
но 10 чего тут? Потому что если выставить допустим 20 и подловить момент когда скрипт покажет
root 4965 26.0 0.8 317084 116304 pts/0 Rl+ 15:37 8:31 ./server_shell
процесс не убивается, продолжает работать...

Помогите разобраться :)

#346798
"servercore" написал:
Вроде процессы он находит нормально, но думаю определяет загрузку по не понятному мне алгоритму

Он нагрузку берёт из uptime.

#346808

Помогите дописать :) переписать...

#346911

вот вам команда:

text
top -n1 | sed -rn 's/^\s*(\S+\s+){8}(\S+)\s+(.*)trojka/\2/p'

только замените "trojka" на имя какого-нибудь ВАШЕГО процесса.

#347080

Спасибо. А можно подробнее расказать. Интересует момент.
Убивается процесс как только он набрал 100% ??? ведь при запуске самого приложения оно может и потребовать 100% загрузки в ТОП
Тут не задан параметр на скольки процентах загрузки убивать процесс?
Поставить в крон с таймером раз в 5 минут на нужные процессы и все? Т.е. данные будут сниматься каждые 5 минут. А если при запуске скрипта загрузка будет 99% не сработает?

#347240

"servercore" написал:
Убивается процесс как только он набрал 100% ??? ведь при запуске самого приложения оно может и потребовать 100% загрузки в ТОП
моя команда просто выводит загрузку CPU по мнению программы top. Она никого не убивает.

"servercore" написал:
Поставить в крон с таймером раз в 5 минут на нужные процессы и все? Т.е. данные будут сниматься каждые 5 минут. А если при запуске скрипта загрузка будет 99% не сработает?
денег мне наверное надо заплатить...
#347495
drBatty написал:
вот вам команда:
text
top -n1 | sed -rn 's/^\s*(\S+\s+){8}(\S+)\s+(.*)trojka/\2/p'

только замените "trojka" на имя какого-нибудь ВАШЕГО процесса.

Выводит ответ типа:
l

text
inux:~ # ./1.sh
S
Sb
linux:~ #

ошибка?

#349624
text
ps -o pcpu= `pgrep btrfs`
Войдите или зарегистрируйтесь, чтобы ответить.