监测NAME是blade-jiangxinzhougarden的服务,如果内存(MEM USAGE)超过3G则在凌晨4点执行重新构建命令
1.编写脚本文件restart_jxz.sh
#!/bin/bash
# 设置要监控的容器名称或服务名称(替换成你的服务名)
SERVICE_NAME="blade-jiangxinzhougarden"
# 获取服务的内存使用情况,这里假设服务对应的容器名称为 blade-jiangxinzhougarden
MEMORY_USAGE=$(docker stats --no-stream --format "{{.MemUsage}}" $SERVICE_NAME | awk '{ memory = $1; sub(/GiB/, "", memory); print memory }')
# 将内存使用量转换为 GB
# MEMORY_GB=$(echo "scale=2; $MEMORY_USAGE / 1024 / 1024 / 1024" | bc)
# 获取当前时间
CURRENT_TIME=$(date +"%Y-%m-%d %H:%M:%S")
# 打印当前时间
echo "当前时间: $CURRENT_TIME"
# 设置内存阈值 不超过3G
CRITICAL_MEMORY=3
# 判断内存使用是否超过阈值
if (( $(echo "$MEMORY_USAGE > $CRITICAL_MEMORY" | bc -l) )); then
echo "内存使用超过临界值,当前内存使用量为: ${MEMORY_USAGE}GB"
echo "执行重启命令..."
# 在这里添加重启服务的命令,比如 Docker 容器重启命令
# 删除服务
docker rm -f blade-jiangxinzhougarden
#等待5s
sleep 10
#删除镜像
docker rmi yutu/blade-jiangxinzhougarden:2.8.2
#等待10s
sleep 10
#给使用的jdk重命名,docker-compose的时候找得到(可忽略这行)
docker tag fb9059866229 adoptopenjdk/openjdk8-openj9:alpine-slim
#等待5s
sleep 5
#cd到docker-compose.yml文件所在路径
cd /home/data/srv
#等待5s
sleep 5
#构建,等待服务启动
docker-compose up -d $SERVICE_NAME
echo "服务启动成功..."
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回车即可保存退出。
也记得给日志文件授予写入的权限
在当前路径下可以找到一个restart_jxz.log
日志文件,每次执行脚本都会写到这个日志文件中,方便我们排查问题。
常见问题
如果出现以下报错,可能是因为脚本文件中包含了 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 换行符。
如果出现no such service: xxxxxxx
如果你的docker-compose.yml文件中镜像是这样的
则在脚本改成
docker-compose up -d blade-jiangxinzhougarden