LINUX.ORG.RU

Убить «повисшие» процессы


0

0

Выполняются некоторые задачи, скажем prog1,prog2. Но так получается, что они иногда виснут. Старший уполномоченный просит написать маленький скрипт, который будет смотреть на cpu time и убивать процессы, у которых cpu time больше, скажем, 10 минут.

Я пытаюсь делать так:

for i in "`ps -eao pid,time,cmd| grep [p]rog`"
do
    # Тут я надеялся, что for возьмёт отдельную строку из выхлопа грепа и я смогу её выпотрошить
    
    if [ чего-то там ]; then
        kill $pid
    fi

done

Но for естественно не понимает отдельные строки, т.е. для него все строки это одна груда слов. Что можно придумать? Может как-то можно заставить выглядеть строки, как отдельные стринги? Пертурбации с кавычками результатов не дают.

Heretique> который будет смотреть на cpu time и убивать процессы, у которых cpu time больше, скажем, 10 минут.

А про ulimit старший «упал намоченный» не слышал?

sdio ★★★★★
()

for можно сделать для выхлопа pgrep <ваш процесс>, в цикле считать только время (ps -o time $i), как-то его парсить (хоть тем же sed'ом), сравнивать, и, если надо - делать kill -9 $i.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ados

Это сработает, если греп выдаст одну строку.

Heretique
() автор топика
Ответ на: комментарий от sdio

А про ulimit старший «упал намоченный» не слышал?

Так это же надо в исходники setrlimit вставлять, или в башевской оболочке запускать с ulimit ...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Heretique

А софт чужой, или самописный? Исходники есть? А то, может, и правда стоит их подправить чудок, чтобы работали правильно?

Eddy_Em ☆☆☆☆☆
()

for i in `ps -eo pid,time,cmd | head -5 | tr " " "-«`; do echo »----"; echo $i; done

swelf
()
Ответ на: комментарий от sdio

>А про ulimit старший «упал намоченный» не слышал?

btw, наряду с ulimit есть софтина, которая может заниматься контролем различных параметров (cpu, memory и тд) и по достижению оных делать что-то с процессом (контролируемый рестарт, в отличие от ulimita когда софтина может просто в сегфолт упасть). Название этой софтины сейчас не помню, если нужно, могу завтра у наших админов «вспомнить».

Deleted
()

Вот так

Строка вывода используется как массив:
ps -ef | while read -a s; do echo ${s[4]}; done

Строка вывода используется как строка:
ps -ef | while read s; do echo $s; done

andreik
()
test="a s23 e3\nw2e3r4t5 ksf;lfd \njkjlfjlsfd"
OLDFS=$IFS
IFS='\n'
for i in $test; do
   echo $i
done
IFS=$OLDFS

как то так тогда разделителем будет не пробельные символы а \n

Skolotovich ★★★
()
ps ho pid,time -C prog1,prog2 \
|awk -F: '$2>10{sub(" ..:.+$","");system("kill -9 "$1)}'
anon_666
()

только подправь под свои нужды чуток:

function kll () {
    if  [ $# = 0 ] || [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
        echo "Giving a percentage of maximum load, kills every process of the current user that takes a load of CPU greater or equal to that given percentage."
        echo -e "It kills every process that produces a load on the CPU greater or equal than the percentage user defined. Usage ${RED_FG}'kll cpu_percentage_usage'$NC"
        return
    fi
    if [ "$1" -le "50" ]; then
        echo "Is dangerous to kill processes that use less than 50% of the CPU. It's not allowed."
        return
    fi


    local PROCS=`ps -u $USER -o %cpu,pid | tr -d '%CPU' | tr -d 'ID' | tr -d '.'`

    local LOAD_TARGET=`expr $1 \* 10`
    local FLAG=0
    for i in $PROCS; do

        # inform at user and kill process
        if [ $FLAG -eq 1 ]; then
            local CMD=`ps -u $USER -o pid,command | tr -d 'ID' | grep "$i" | head -n 1`
            echo "pid, program: $CMD"
            echo -n "killing... "

            # first try SIGTERM if, fails try SIGKILL
            if kill $i; then
                echo -e "${GREEN_FG}done!$NC\n"
            else
                if kill -9 $i; then echo -e "${GREEN_FG}done!$NC\n"
                else echo -e "${RED_FG}ERROR!$NC\n"; fi
            fi
            FLAG=0
        fi
        # look the % cpu load of all processes
        if [ "$i" -le "1000" ] && [ "$i" -gt "$LOAD_TARGET" ]; then
            local LOAD=`expr $i / 10`
            echo "found process using $LOAD% of cpu"
            FLAG=1
        fi
    done
}
ciiccii
()

-9 посылать надо. Чтоб наверняка.

true_admin ★★★★★
()

Спасибо всем, сделал, как советовали ados и andreik. Вроде я и знал про такую конструкцию, но почему-то в голову не пришло. Я ещё зелен.

anon_666, awk слишком крут. Мне хочется писать такие скрипты, которые были бы настолько элегантны и просты, что любой школьник мог бы разобараться в них после двухнедельных курсов.

Heretique
() автор топика
Ответ на: комментарий от Eddy_Em

>for можно сделать для выхлопа pgrep <ваш процесс>

Мы работаем на AIX. Поэтому пгрепа у нас нету.

А софт чужой, или самописный? Исходники есть? А то, может, и правда стоит их подправить чудок, чтобы работали правильно?

Мне выпала честь пройти практику на одном большом (2500 человек) металлообрабатывающем предприятии. Они работают на z/OS, но сейчас переходят на AIX. И они решили взять студента, который точными пушечными выстрелами будет подсоблять. В глубь меня не пускают, да я и не рвусь. Я же не программер какой-то. Вроде как они запускают собственные программы, написанные на NATURAL и у меня такое чувство, что некоторые из этих программ старше меня. Вообщем не думаю, что на данном этапе они захотят что-то там менять в потрохах.

Вообще эта практика досталась мне в сложныый период жизни, когда имела место быть полоса неудач. И это было вне сомнения для меня самым позитивным событием 2010 года. Линуксы вообще-то не моя специальность. Это то, чем я самостоятельно заинтересовался и немножко, на пользовательском уровне, изучил.

Сформулировав окончательно, игры с линуксом помогли мне остаться на плаву, заправиться самоуверенностью и надеждой. Может ещё и получится ещё что-нибудь в жизни.

Heretique
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.