Сценарий Unix, чтобы убить процесс после проверки условия несколько раз, а также периодически запускать
Я хочу написать сценарий оболочки 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 ответ
Чего ты пытаешься достичь?
Похоже, очень хакерский способ контролировать процесс. Не могли бы вы просто нанять:
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