本文目录导读:

在Shell脚本中查看容器资源使用情况,主要有以下几种常用方法:
使用 Docker 命令
查看单个容器资源
#!/bin/bash
# 查看特定容器的CPU、内存使用
docker stats <container_name_or_id> --no-stream
# 查看所有容器的资源使用
docker stats --no-stream
# 格式化输出
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"
查看容器详细信息
#!/bin/bash
container_name="your_container"
# 获取内存使用情况
memory_info=$(docker inspect $container_name --format='{{.State.Status}}')
echo "容器状态: $memory_info"
# 查看资源限制
cpu_limit=$(docker inspect $container_name --format='{{.HostConfig.CpuShares}}')
memory_limit=$(docker inspect $container_name --format='{{.HostConfig.Memory}}')
echo "CPU限制: $cpu_limit"
echo "内存限制: $((memory_limit/1024/1024)) MB"
使用 cgroups 直接读取
读取容器cgroup信息
#!/bin/bash container_id="<container_id>" # 内存使用情况 memory_usage=$(cat /sys/fs/cgroup/memory/docker/$container_id/memory.usage_in_bytes) memory_limit=$(cat /sys/fs/cgroup/memory/docker/$container_id/memory.limit_in_bytes) echo "内存使用: $((memory_usage/1024/1024)) MB" echo "内存限制: $((memory_limit/1024/1024)) MB" # CPU使用情况 cpu_usage=$(cat /sys/fs/cgroup/cpu/docker/$container_id/cpuacct.usage) echo "CPU总使用: $((cpu_usage/1000000)) ms"
完整的监控脚本示例
#!/bin/bash
# 容器资源监控脚本
MONITOR_INTERVAL=5
LOG_FILE="container_monitor.log"
monitor_container() {
local container_name=$1
echo "开始监控容器: $container_name"
echo "时间戳 | CPU% | 内存使用 | 内存限制 | 内存%" >> $LOG_FILE
while true; do
# 获取容器stats
stats=$(docker stats $container_name --no-stream --format "{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" 2>/dev/null)
if [ $? -ne 0 ]; then
echo "错误: 容器 $container_name 不存在或无法访问"
exit 1
fi
timestamp=$(date "+%Y-%m-%d %H:%M:%S")
cpu_percent=$(echo $stats | cut -f1)
memory_usage=$(echo $stats | cut -f2)
memory_percent=$(echo $stats | cut -f3)
# 记录日志
echo "$timestamp | $cpu_percent | $memory_usage | $memory_percent" >> $LOG_FILE
# 检查内存使用率是否超过阈值
mem_percent_value=$(echo $memory_percent | sed 's/%//')
if (( $(echo "$mem_percent_value > 80" | bc -l) )); then
echo "警告: 容器 $container_name 内存使用率超过80%!"
fi
sleep $MONITOR_INTERVAL
done
}
# 检查参数
if [ $# -eq 0 ]; then
echo "用法: $0 <container_name>"
exit 1
fi
# 检查Docker是否运行
if ! docker info >/dev/null 2>&1; then
echo "错误: Docker未运行"
exit 1
fi
# 启动监控
monitor_container $1
获取多个容器的资源统计
#!/bin/bash
get_all_containers_stats() {
echo "容器资源使用统计"
echo "=================="
printf "%-25s %-10s %-15s %-15s %-8s\n" "容器名" "CPU%" "内存使用" "内存限制" "内存%"
echo "---------------------------------------------------------------"
# 获取所有运行中的容器stats
docker stats --no-stream --format "{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" | \
while IFS=$'\t' read -r name cpu mem mem_perc; do
printf "%-25s %-10s %-15s %-8s\n" "$name" "$cpu" "$mem" "$mem_perc"
done
}
# 执行
get_all_containers_stats
检查容器是否超过资源限制
#!/bin/bash
check_resource_limits() {
local container=$1
local cpu_threshold=80
local mem_threshold=80
# 获取当前使用率
cpu_usage=$(docker stats $container --no-stream --format "{{.CPUPerc}}" | sed 's/%//')
mem_usage=$(docker stats $container --no-stream --format "{{.MemPerc}}" | sed 's/%//')
# 比较阈值
if (( $(echo "$cpu_usage > $cpu_threshold" | bc -l) )); then
echo "CPU使用率警告: $cpu_usage% (阈值: $cpu_threshold%)"
fi
if (( $(echo "$mem_usage > $mem_threshold" | bc -l) )); then
echo "内存使用率警告: $mem_usage% (阈值: $mem_threshold%)"
fi
}
# 对每个容器进行检查
for container in $(docker ps --format "{{.Names}}"); do
echo "检查容器: $container"
check_resource_limits $container
echo "---"
done
使用建议
- 性能考虑:频繁调用
docker stats可能影响性能,建议适当增加间隔时间 - 错误处理:添加容器存在性检查和Docker运行状态检查
- 日志记录:对重要监控数据记录日志,便于后续分析
- 阈值告警:设置合理的资源使用阈值,及时发现问题
这些脚本可以根据实际需求进行修改和扩展,比如添加邮件告警、连接监控系统等。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播