Вот ситуация ... У меня есть программа, которую я запускаю в Wine. Эта программа иногда зависает .. Я хотел создать «скрипт мониторинга», чтобы посмотреть его, а затем убить и перезапустить, если он зависнет. Я получил его, чтобы найти процесс и убить его, если он зависает, но сценарий останавливается на этом этапе без завершения ... окончание будет состоять в том, чтобы спать в течение 30 секунд, а затем снова запустить программу ... но вместо этого ... сценарий просто останавливается
Прежде всего, я скажу, что я очень плохо пишу такие вещи, как это ... это из-за того, что гуглил, складывал в файл и пытался заставить его делать то, что я хочу: D
Вот то, что у меня есть ... немного неряшливо и, возможно, кое-что можно почистить ...
#!/bin/bash
CPU_USAGE_THRESHOLD="120"
TOPPROCESS="0"
i="1"
re='^[0-9]+([.][0-9]+)? Результат этого, похоже, останавливается на том, чтобы убить процесс ... Я получаю это в результате, если я запускаю это из командной строки.
{~}:$ monitorsam
the calculated top process2 is 121
the usage threshold is 120
{~}:$
Кажется, что он останавливается после уничтожения, потому что этого не происходит. echo "process killed"
Причина, по которой у меня есть process и process2, заключается в том, что по какой-то причине нужное мне значение будет отображаться в том или ином виде. на что его PID.
Как я уже сказал, я очень плохо разбираюсь в этом ... Я не совсем понимаю код, я просто скопировал его из поисков Google, нашел ошибки и исправил их с помощью Google ... но .. все еще действительно не понимаю полностью ... только незначительное понимание ... это, вероятно, какая-то точка с запятой или что-то, чего я пропускаю, но я попробовал все, что мог придумать.
Это убивает процесс, когда он зависает ... но не запускает его снова и не продолжает запускать скрипт monitorsam ... Я хочу, чтобы он перезапустил программу и продолжал отслеживать его, чтобы он мог убейте его и перезапустите снова, если он снова зависнет.
Извините за книгу, но я хотел убедиться, что предоставил всю информацию, какую только мог: D
любая помощь будет принята с благодарностью.
while [ $i -eq 1 ]; do
MYPROCESS=$(ps aux --sort=-pcpu | grep -v %CPU | head -n 1 | cut -d"." -f1 | cut -d" " -f7)
MYPROCESS2=$(ps aux --sort=-pcpu | grep -v %CPU | head -n 1 | cut -d"." -f1 | cut -d" " -f6)
if ! [[ $MYPROCESS2 =~ $re ]] ; then
>&2;
else
if [ "$MYPROCESS2" -gt "1" ]; then
TOPPROCESS="$MYPROCESS2"
echo "the calculated top process2 is $TOPPROCESS"
echo "the usage threshold is $CPU_USAGE_THRESHOLD";
fi
fi
if ! [[ $MYPROCESS =~ $re ]] ; then
>&2;
else
if [ "$MYPROCESS" -gt "1" ]; then
TOPPROCESS="$MYPROCESS"
echo "the calculated top process is $TOPPROCESS"
echo "the usage threshold is $CPU_USAGE_THRESHOLD";
fi
fi
if [ "$TOPPROCESS" -gt "$CPU_USAGE_THRESHOLD" ]; then
exec pkill SAMBC.exe;
echo "process killed"
sleep 30
exec wine C:\\SAMBC\\SAMBC.exe
sleep 60
i="1"
else
sleep 60
i="1"
fi
done
Результат этого, похоже, останавливается на том, чтобы убить процесс ... Я получаю это в результате, если я запускаю это из командной строки.
{~}:$ monitorsam
the calculated top process2 is 121
the usage threshold is 120
{~}:$
Кажется, что он останавливается после уничтожения, потому что этого не происходит. echo "process killed"
Причина, по которой у меня есть process и process2, заключается в том, что по какой-то причине нужное мне значение будет отображаться в том или ином виде. на что его PID.
Как я уже сказал, я очень плохо разбираюсь в этом ... Я не совсем понимаю код, я просто скопировал его из поисков Google, нашел ошибки и исправил их с помощью Google ... но .. все еще действительно не понимаю полностью ... только незначительное понимание ... это, вероятно, какая-то точка с запятой или что-то, чего я пропускаю, но я попробовал все, что мог придумать.
Это убивает процесс, когда он зависает ... но не запускает его снова и не продолжает запускать скрипт monitorsam ... Я хочу, чтобы он перезапустил программу и продолжал отслеживать его, чтобы он мог убейте его и перезапустите снова, если он снова зависнет.
Извините за книгу, но я хотел убедиться, что предоставил всю информацию, какую только мог: D
любая помощь будет принята с благодарностью.
Несколько вещей:
i
всегда 1
в вашем сценарии, AFAICT. Так что нет смысла использовать его, и это проще сделать:
while true; do
...
done
Вы exec
pkill
и wine
. exec
заменяет текущую оболочку командой, которая должна быть выполнена, поэтому ваш сценарий эффективно завершается, когда он exec
что-то делает. Просто сделайте pkill SAMBC.exe
и wine C:\\SAMBC\\SAMBC.exe
. Команду wine
может потребоваться отправить в фоновый режим: wine C:\\SAMBC\\SAMBC.exe &
.
Если вы хотите получить использование ЦП определенного процесса, проще, если вы используете pgrep
, чтобы получить PID, и ps
, чтобы получить только использование ЦП:
process_usage=$(ps -o pcpu= $(pgrep SAMBC.exe) | sed 's/\..*//')
Команда sed
удаляет конечные десятичные дроби.
Объединение и упрощение:
#!/bin/bash
CPU_USAGE_THRESHOLD="120"
while true; do
proc_usage=$(ps -o pcpu= $(pgrep SAMBC.exe) | sed 's/\..*//')
if (( proc_usage > CPU_USAGE_THRESHOLD )); then
pkill SAMBC.exe;
echo "process killed"
sleep 30
wine C:\\SAMBC\\SAMBC.exe &
fi
sleep 60
done