Linux中判断某个Docker容器服务的内存是否超过临界值,比如到达3G,则在凌晨4点执行定时任务执行重新构建命令

监测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
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

令人作呕的溏心蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值