Мой цикл останавливается, но не могу понять, почему

Вот ситуация ... У меня есть программа, которую я запускаю в 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

любая помощь будет принята с благодарностью.

0
задан 8 December 2017 в 09:10

1 ответ

Несколько вещей:

  • 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
3
ответ дан 8 December 2017 в 09:10

Другие вопросы по тегам:

Похожие вопросы: