0

コマンドを 80 秒ごとに 3 回実行する UNIX シェル スクリプトを作成し、すべてのシーケンスをテキスト ファイルの別の行に書き込みたいと考えています。また、すべての結果が1行に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」のようなものであれば、殺す必要はありません。

4

1 に答える 1

1

達成しようとしていますか?

プロセスを監視するための非常にハックな方法のように思えます。単純に採用できませんでした:

ulimit -T 10    # the maximum number of threads

またはバリエーション(man bash/ulimit Enter)?

そうすれば、プログラムは自分自身をシャットダウンする際により適切になる可能性さえあります。


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
于 2011-06-27T14:40:20.807 に答える