为什么有时候会进入这里”more than 1 “ ,但是实际只有一个进程?如何修复这个sh脚本?
时间: 2024-03-10 14:49:36 浏览: 16
这个问题可能是由于进程监控的逻辑有问题导致的。在脚本中,如果监控到指定的进程数量大于 1,则会杀掉所有进程并重启。但是这个逻辑有一个缺陷,即如果有一个进程处于僵尸状态,`ps` 命令也会将其计入进程数量中,从而导致误判。为了解决这个问题,可以将进程的状态加入判断条件中,只杀掉处于运行状态的进程。同时,可以使用更加准确的进程监控工具,比如 `pgrep` 命令,它可以根据进程名和其他条件来查找进程,避免误判。
以下是修复后的脚本:
```sh
#!/bin/sh
echo 1048576 > /proc/sys/net/core/wmem_default
echo 1048576 > /proc/sys/net/core/wmem_max
export LD_LIBRARY_PATH=/opt/app/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=/opt/app/bin/lighthttpd/lib:${LD_LIBRARY_PATH}
eval PRO_NAME_1="/opt/app/bin/mixer"
eval PRO_NAME_2="/opt/app/bin/AutoUpdater"
eval PRO_NAME_3="/opt/app/bin/SearchClient"
eval PRO_NAME_4="/opt/app/bin/lighthttpd/sbin/lighttpd"
PRO_PARAMS_3=" &"
PRO_PARAMS_2=" &"
PRO_PARAMS_1=" &"
PRO_PARAMS_4="-f /opt/app/bin/lighthttpd/config/lighttpd.conf &"
#base_path=$(cd `dirname $0`; pwd)
base_path=/opt/app/bin
version_ini=$base_path/cfg/version.conf
PRO_INDEX=0
Total=5
echo "start..."
while true ; do
while true ; do
let PRO_INDEX++
if [ $PRO_INDEX -gt 3 ]; then
echo "break"
let PRO_INDEX=0
break
fi
eval PRO_NAME="\$PRO_NAME_$PRO_INDEX"
eval PRO_PARAMS="\$PRO_PARAMS_$PRO_INDEX"
#用pgrep获取$PRO_NAME进程数量
NUM=`pgrep -c -x ${PRO_NAME}`
#少于1,重启进程
if [ "${NUM}" -lt "1" ];then
echo "${PRO_NAME} was killed "
s32Type=`awk -F '=' '/\[Main\]/{a=1}a==1&&$1~/NeedToUpdate/{print $2;exit}' $version_ini`
if [ $s32Type -eq 1 -a ${PRO_INDEX} -eq 1 ]
then
echo "Updating... waiting....${PRO_NAME}"
else
${PRO_NAME} ${PRO_PARAMS} &
fi
#大于1,杀掉所有运行状态的进程,重启
elif [ "${NUM}" -gt "1" ];then
echo "more than 1 ${PRO_NAME}, killing all running processes"
pkill -9 -x -f ${PRO_NAME}
${PRO_NAME} ${PRO_PARAMS} &
fi
sleep 1s
done
sleep 5s
done
exit 0
```
修复后的脚本中使用 `pgrep` 命令来获取进程数量,只杀掉处于运行状态的进程。同时,修复了 `while` 循环嵌套时的逻辑错误,避免了进程重复启动的问题。