监测NAME是blade-jiangxinzhougarden的服务,如果内存(MEM USAGE)超过10G则在凌晨4点执行重新构建命令
1.编写脚本文件restart_jxz.sh
#!/bin/bash
# 设置要监控的容器名称或服务名称(替换成你的服务名)
SERVICE_NAME="blade-jiangxinzhougarden"
# 获取服务的内存使用情况,这里假设服务对应的容器名称为 $SERVICE_NAME 将内存使用量转换为 GB
MEMORY_USAGE=$(docker stats --no-stream --format "{{.MemUsage}}" $SERVICE_NAME | awk '{ memory = $1; sub(/GiB/, "", memory); print memory }')
# 设置内存阈值 不超过10G
CRITICAL_MEMORY=10
# 判断内存使用是否超过阈值
if (( $(echo "$MEMORY_USAGE > $CRITICAL_MEMORY" | bc -l) )); then
echo "内存使用超过临界值,当前内存使用量为: ${MEMORY_USAGE}GB"
echo "执行重启命令..."
# 在这里添加重启服务的命令,比如 Docker 容器重启命令
# 重启服务的命令
docker rm -f blade-jiangxinzhougarden
# 延迟15秒
sleep 15
docker rmi yutu/blade-jiangxinzhougarden:2.8.2
# 延迟15秒
sleep 15
docker-compose up -d blade-jiangxinzhougarden
# 等待服务启动
echo "等待服务启动..."
# 以下是判断服务器是否已经成功启动的while循环代码
# (注意:如果你没有需求则可以把以下的while代码删除)
# 避免出现意外导致服务启动不起来,处于死循环状态
# 一旦出现死循环就会给服务器资源造成负担
while true; do
# 判断服务器是否已经成功启动
if docker ps | grep blade-jiangxinzhougarden; then
echo "服务已启动,继续后续操作"
# 跳出while循环
break
else
echo "服务尚未完全启动,继续等待..."
sleep 10
fi
done
else
echo "内存使用正常,当前内存使用量为: ${MEMORY_USAGE}GB"
fi
2.授予执行权限
确保脚本文件有执行权限,可以在终端通过运行 chmod +x monitor_script.sh 给予执行权限。
chmod +x restart_jxz.sh
或者直接给予777权限,这个命令将会设置指定的文件为所有用户可读、可写、可执行。尽量避免过度赋予文件权限,因为这可能会造成安全风险。
chmod 777 restart_jxz.sh
3.配置定时任务
在终端执行crontab -e命令进入配置定时任务命令
crontab -e
进入后按下键盘的Ins键进入编辑模式,把以下内容复制进去即可在凌晨4点执行。
0 4 * * * /home/data/srv/restart_jxz.sh >> /home/data/srv/restart_jxz.log 2>&1
请替换 /home/data/srv/restart_jxz.sh 为实际脚本文件的路径,将脚本执行结果输出到指定的日志文件
/home/data/srv/restart_jxz.log 中。
编辑完成后按下键盘的Esc键,再按下Shift+;组合键,出现冒号后输入wq回车即可保存退出。
也记得给日志文件授予写入的权限
常见问题
如果出现以下报错,可能是因为脚本文件中包含了 Windows 下的换行符(\r\n)而不是 Unix 下的换行符(\n)导致的。这种情况下,系统会将 \r 当作命令的一部分,导致解释器无法找到对应的文件或目录。
/bin/sh: /home/data/srv/restart_jxz.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
要解决这个问题,你可以使用 dos2unix 命令将文件转换为 Unix 格式。在终端中执行以下命令:
dos2unix /home/data/srv/restart_jxz.sh
这会将 restart_jxz.sh 文件转换为 Unix 格式,去除 Windows 换行符。然后再次运行定时任务,看看是否能够成功执行脚本。
如果你的系统没有安装 dos2unix 命令,你可以尝试使用 sed 命令来替换换行符。你可以执行以下命令:
sed -i 's/\r//' /home/data/srv/restart_jxz.sh
这样也可以将文件中的 Windows 换行符替换为 Unix 换行符。