情况是这样的...我有一个在 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
执行pkill
和wine
。exec
将当前 shell 替换为要执行的命令,因此您的脚本在 时实际上会结束exec
。只需执行pkill SAMBC.exe
和wine C:\\SAMBC\\SAMBC.exe
。wine
可能需要将命令发送到后台: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