我的循环已停止,但无法弄清楚原因

我的循环已停止,但无法弄清楚原因

情况是这样的...我有一个在 wine 中运行的程序。这个程序有时会挂起...我想创建一个“监控脚本”来监视它,如果它挂起,就杀死它并重新启动它。我已经让它找到进程并在它挂起时杀死它,但脚本在那时停止而没有完成...完成应该是休眠 30 秒,然后再次启动程序...但相反...脚本只是停止了

首先我要说的是,我很不擅长写这样的东西...这是我从谷歌搜索到的东西,然后把它放到一个文件中,试图让它做我想做的事情:D

这是我所拥有的......它有点草率,可能需要清理一下......

#!/bin/bash

CPU_USAGE_THRESHOLD="120"
TOPPROCESS="0"
i="1"
re='^[0-9]+([.][0-9]+)?$'

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" 我拥有进程和进程2的原因是由于某种原因我需要的值将显示在其中一个或另一个上..我认为这取决于它的PID是什么。

就像我说的,我对这些东西很不擅长..我真的不完全理解代码,我只是从谷歌搜索中复制它,找到错误并使用谷歌纠正它们..但是..仍然真的不完全理解..只是稍微理解了一下...可能是一些分号或者我遗漏的东西,但我尝试了所有我能想到的。

当它挂起时它会终止该进程...但不会再次启动它并且不会继续运行monitorsam脚本...我希望它重新启动该程序并继续监视它以便它可以终止它并在它再次挂起时再次重新启动它。

哈哈,对不起,但我想确保我提供了所有我能提供的信息:D

任何帮助,将不胜感激。

答案1

一些东西:

  • i就我所知,它始终存在1于您的脚本中。因此没有必要使用它,而且这样做更简单:

    while true; do
    ...
    done
    
  • 您正在exec执行pkillwineexec将当前 shell 替换为要执行的命令,因此您的脚本在 时实际上会结束exec。只需执行pkill SAMBC.exewine C:\\SAMBC\\SAMBC.exewine可能需要将命令发送到后台:wine C:\\SAMBC\\SAMBC.exe &

  • 如果要获取特定进程的 CPU 使用率,使用以下命令pgrep获取 PID 并ps仅获取 CPU 使用率会更容易:

    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

相关内容