Сценарий Unix, чтобы убить процесс после проверки условия несколько раз, а также периодически запускать - PullRequest
0 голосов
/ 27 июня 2011

Я хочу написать сценарий оболочки Unix, который будет запускать команду 3 раза каждые 80 секунд и записывать каждую последовательность в отдельной строке в текстовом файле.А также, если все результаты по 10 или более в строке, я хочу завершить процесс:

например:

pstack <pid> | grep -c 'abcd'

5

pstack <pid> | grep -c 'abcd'

5

pstack <pid> | grep -c 'abcd'

5

//Nothing to do.

//after 80 seconds again it runs:

pstack <pid> | grep -c 'abcd'

10 

pstack <pid> | grep -c 'abcd'

10

pstack <pid> | grep -c 'abcd'

10

kill -9 < PID>     // because all three outputs are bigger than 10   

также

выходной файл:

5 5 5 

10 10 10 

Обратите внимание, что если выходной последовательностью является «10 10 11», «10 11 12» и т. Д., То процесс должен быть снова завершен.Но если это похоже на «9 9 10», то убивать не нужно.

1 Ответ

1 голос
/ 27 июня 2011

Чего вы пытаетесь достичь?

Звучит как очень хакерский способ наблюдения за процессом. Не могли бы вы просто нанять:

ulimit -T 10    # the maximum number of threads

или вариант (man bash, / ulimit Ввод )?

Таким образом, программа могла бы даже более грациозно закрыться.


Примечание : поскольку вы предлагаете использовать kill -9 без использования других сигналов, возможно, вы подразумеваете, что сигналы никогда не обрабатываются? В этом случае вы, вероятно, можете использовать ulimit -i ( максимальное количество ожидающих сигналов )

Отрывок

#!/bin/bash

function dumpstack()
{
    pstack $(pgrep a.exe) | grep -c abcd
}

while sleep 1; do dumpstack; done | tee rawoutput.log |
    {
        trap "" INT
        count=0;
        while read stackframes; do 
            if [[ $stackframes -lt 10 ]]; then
                count=0
            else
                count=$(($count+1))
            fi

            if [[ $count -ge 3 ]]; then
                echo KILL -9 !
                            break
            fi
            echo "(debug frames:$stackframes, count:$count)"
        done
    } | tee cooked_output.log
...