更新 scripts/deploy_gpu_monitor.sh

This commit is contained in:
joy 2025-07-28 17:32:12 +08:00
parent 2e0567988c
commit 5c1dd6f80c
1 changed files with 60 additions and 53 deletions

View File

@ -4,6 +4,13 @@
set -euo pipefail set -euo pipefail
IFS=$'\n\t' IFS=$'\n\t'
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 恢复默认颜色
# 配置信息 # 配置信息
SCRIPT_URL="http://116.205.97.109/scripts/gpu_metrics.sh" # 脚本下载地址 SCRIPT_URL="http://116.205.97.109/scripts/gpu_metrics.sh" # 脚本下载地址
TARGET_DIR="/opt/scripts" # 脚本存放目录 TARGET_DIR="/opt/scripts" # 脚本存放目录
@ -17,20 +24,20 @@ NODE_EXPORTER_SERVICE="node_exporter.service" # node_exporter服务名
# 帮助信息 # 帮助信息
show_help() { show_help() {
echo "用法: $0 [选项]" echo -e "${BLUE}用法: $0 [选项]${NC}"
echo "GPU监控脚本部署工具必须指定--install或--uninstall" echo -e "${BLUE}GPU监控脚本部署工具必须指定--install或--uninstall${NC}"
echo "" echo ""
echo "选项:" echo -e "${GREEN}选项:${NC}"
echo " --install 安装并配置GPU监控脚本重启node_exporter" echo -e " ${YELLOW}--install${NC} 安装并配置GPU监控脚本重启node_exporter"
echo " --uninstall 卸载GPU监控脚本及配置删除指标文件并重启node_exporter" echo -e " ${YELLOW}--uninstall${NC} 卸载GPU监控脚本及配置删除指标文件并重启node_exporter"
echo " --help 显示此帮助信息" echo -e " ${YELLOW}--help${NC} 显示此帮助信息"
echo "" echo ""
} }
# 检查是否以root权限运行 # 检查是否以root权限运行
check_root() { check_root() {
if [ "$(id -u)" -ne 0 ]; then if [ "$(id -u)" -ne 0 ]; then
echo "错误: 此脚本需要root权限运行请使用sudo" >&2 echo -e "${RED}错误: 此脚本需要root权限运行请使用sudo${NC}" >&2
exit 1 exit 1
fi fi
} }
@ -42,19 +49,19 @@ service_exists() {
# 重启node_exporter并检查状态 # 重启node_exporter并检查状态
restart_node_exporter() { restart_node_exporter() {
echo "检查node_exporter服务状态..." echo -e "${BLUE}检查node_exporter服务状态...${NC}"
if service_exists "${NODE_EXPORTER_SERVICE}"; then if service_exists "${NODE_EXPORTER_SERVICE}"; then
echo "正在重启node_exporter服务..." echo -e "${BLUE}正在重启node_exporter服务...${NC}"
systemctl restart "${NODE_EXPORTER_SERVICE}" || true # 允许失败,不中断流程 systemctl restart "${NODE_EXPORTER_SERVICE}" || true # 允许失败,不中断流程
echo "检查node_exporter状态..." echo -e "${BLUE}检查node_exporter状态...${NC}"
if systemctl is-active --quiet "${NODE_EXPORTER_SERVICE}"; then if systemctl is-active --quiet "${NODE_EXPORTER_SERVICE}"; then
echo "node_exporter状态: 运行中" echo -e "${GREEN}node_exporter状态: 运行中${NC}"
else else
echo "警告: node_exporter未正常运行请查看日志journalctl -u ${NODE_EXPORTER_SERVICE}" >&2 echo -e "${YELLOW}警告: node_exporter未正常运行请查看日志journalctl -u ${NODE_EXPORTER_SERVICE}${NC}" >&2
fi fi
else else
echo "警告: node_exporter服务不存在跳过重启" >&2 echo -e "${YELLOW}警告: node_exporter服务不存在跳过重启${NC}" >&2
fi fi
} }
@ -64,7 +71,7 @@ add_cron_job() {
# 检查任务是否已存在(精确匹配) # 检查任务是否已存在(精确匹配)
if crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then if crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then
echo "定时任务已存在,跳过添加" echo -e "${YELLOW}定时任务已存在,跳过添加${NC}"
return 0 return 0
fi fi
@ -73,7 +80,7 @@ add_cron_job() {
crontab -l 2>/dev/null > "${backup_file}" || true crontab -l 2>/dev/null > "${backup_file}" || true
# 添加新任务 # 添加新任务
echo "添加定时任务: ${cron_line}" echo -e "${BLUE}添加定时任务: ${cron_line}${NC}"
( (
crontab -l 2>/dev/null || true # 获取现有crontab如果有 crontab -l 2>/dev/null || true # 获取现有crontab如果有
echo "${cron_line}" # 添加新任务 echo "${cron_line}" # 添加新任务
@ -81,13 +88,13 @@ add_cron_job() {
# 验证添加结果 # 验证添加结果
if crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then if crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then
echo "定时任务添加成功" echo -e "${GREEN}定时任务添加成功${NC}"
else else
echo "错误: 定时任务添加失败" >&2 echo -e "${RED}错误: 定时任务添加失败${NC}" >&2
# 恢复备份 # 恢复备份
if [ -f "${backup_file}" ]; then if [ -f "${backup_file}" ]; then
crontab "${backup_file}" crontab "${backup_file}"
echo "已恢复原crontab" echo -e "${BLUE}已恢复原crontab${NC}"
fi fi
return 1 return 1
fi fi
@ -95,28 +102,28 @@ add_cron_job() {
# 安装函数 # 安装函数
install_script() { install_script() {
echo "===== 开始安装GPU监控脚本 =====" echo -e "${GREEN}===== 开始安装GPU监控脚本 =====${NC}"
# 1. 清理旧指标文件(避免残留数据) # 1. 清理旧指标文件(避免残留数据)
echo "清理旧指标文件..." echo -e "${BLUE}清理旧指标文件...${NC}"
if [ -f "${METRICS_FILE}" ]; then if [ -f "${METRICS_FILE}" ]; then
rm -f "${METRICS_FILE}" rm -f "${METRICS_FILE}"
echo "已删除旧指标文件: ${METRICS_FILE}" echo -e "${GREEN}已删除旧指标文件: ${METRICS_FILE}${NC}"
fi fi
# 2. 创建目标目录并下载脚本 # 2. 创建目标目录并下载脚本
mkdir -p "${TARGET_DIR}" mkdir -p "${TARGET_DIR}"
cd "${TARGET_DIR}" cd "${TARGET_DIR}"
echo "正在下载GPU监控脚本..." echo -e "${BLUE}正在下载GPU监控脚本...${NC}"
wget -q -O "${TARGET_SCRIPT}" "${SCRIPT_URL}" || { wget -q -O "${TARGET_SCRIPT}" "${SCRIPT_URL}" || {
echo "错误: 无法从 ${SCRIPT_URL} 下载脚本" >&2 echo -e "${RED}错误: 无法从 ${SCRIPT_URL} 下载脚本${NC}" >&2
exit 1 exit 1
} }
chmod +x "${TARGET_SCRIPT}" chmod +x "${TARGET_SCRIPT}"
# 3. 脚本配置确保GPU总数为8 # 3. 脚本配置确保GPU总数为8
echo "配置脚本参数..." echo -e "${BLUE}配置脚本参数...${NC}"
sed -i 's/EXPECTED_GPUS=".*"/EXPECTED_GPUS="0 1 2 3 4 5 6 7"/' "${TARGET_SCRIPT}" sed -i 's/EXPECTED_GPUS=".*"/EXPECTED_GPUS="0 1 2 3 4 5 6 7"/' "${TARGET_SCRIPT}"
# 4. 准备metrics目录 # 4. 准备metrics目录
@ -124,13 +131,13 @@ install_script() {
chmod 755 "${METRICS_DIR}" chmod 755 "${METRICS_DIR}"
# 5. 配置定时任务(安全添加,避免重复) # 5. 配置定时任务(安全添加,避免重复)
echo "配置定时任务..." echo -e "${BLUE}配置定时任务...${NC}"
add_cron_job || exit 1 add_cron_job || exit 1
# 6. 首次执行脚本生成指标 # 6. 首次执行脚本生成指标
echo "测试执行脚本..." echo -e "${BLUE}测试执行脚本...${NC}"
"${TARGET_SCRIPT}" || { "${TARGET_SCRIPT}" || {
echo "错误: 脚本执行失败,请检查日志: ${LOG_FILE}" >&2 echo -e "${RED}错误: 脚本执行失败,请检查日志: ${LOG_FILE}${NC}" >&2
exit 1 exit 1
} }
@ -138,20 +145,20 @@ install_script() {
restart_node_exporter restart_node_exporter
# 8. 验证结果 # 8. 验证结果
echo "===== 安装完成 =====" echo -e "${GREEN}===== 安装完成 =====${NC}"
echo "脚本位置: ${TARGET_SCRIPT}" echo -e "${BLUE}脚本位置:${NC} ${TARGET_SCRIPT}"
echo "定时任务: $(crontab -l | grep "${TARGET_SCRIPT}")" echo -e "${BLUE}定时任务:${NC} $(crontab -l | grep "${TARGET_SCRIPT}")"
echo "日志文件: ${LOG_FILE}" echo -e "${BLUE}日志文件:${NC} ${LOG_FILE}"
echo "指标文件: ${METRICS_FILE}(已生成)" echo -e "${BLUE}指标文件:${NC} ${METRICS_FILE}${GREEN}(已生成)${NC}"
echo "node_exporter状态: $(systemctl is-active "${NODE_EXPORTER_SERVICE}" 2>/dev/null || echo "未安装")" echo -e "${BLUE}node_exporter状态:${NC} $(systemctl is-active "${NODE_EXPORTER_SERVICE}" 2>/dev/null || echo -e "${YELLOW}未安装${NC}")"
} }
# 卸载函数 # 卸载函数
uninstall_script() { uninstall_script() {
echo "===== 开始卸载GPU监控脚本 =====" echo -e "${YELLOW}===== 开始卸载GPU监控脚本 =====${NC}"
# 1. 移除定时任务 # 1. 移除定时任务
echo "删除定时任务..." echo -e "${BLUE}删除定时任务...${NC}"
local cron_line="${CRON_SCHEDULE} ${TARGET_SCRIPT} >> ${LOG_FILE} 2>&1" local cron_line="${CRON_SCHEDULE} ${TARGET_SCRIPT} >> ${LOG_FILE} 2>&1"
if crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then if crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then
@ -164,51 +171,51 @@ uninstall_script() {
# 验证移除结果 # 验证移除结果
if ! crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then if ! crontab -l 2>/dev/null | grep -qxF "${cron_line}"; then
echo "已成功删除定时任务" echo -e "${GREEN}已成功删除定时任务${NC}"
else else
echo "错误: 定时任务删除失败" >&2 echo -e "${RED}错误: 定时任务删除失败${NC}" >&2
# 恢复备份 # 恢复备份
crontab "${backup_file}" crontab "${backup_file}"
echo "已恢复原crontab" echo -e "${BLUE}已恢复原crontab${NC}"
exit 1 exit 1
fi fi
else else
echo "未找到相关定时任务,跳过" echo -e "${YELLOW}未找到相关定时任务,跳过${NC}"
fi fi
# 2. 删除脚本文件 # 2. 删除脚本文件
echo "删除监控脚本..." echo -e "${BLUE}删除监控脚本...${NC}"
if [ -f "${TARGET_SCRIPT}" ]; then if [ -f "${TARGET_SCRIPT}" ]; then
rm -f "${TARGET_SCRIPT}" rm -f "${TARGET_SCRIPT}"
echo "已删除脚本: ${TARGET_SCRIPT}" echo -e "${GREEN}已删除脚本: ${TARGET_SCRIPT}${NC}"
else else
echo "脚本文件不存在,跳过" echo -e "${YELLOW}脚本文件不存在,跳过${NC}"
fi fi
# 3. 删除指标文件 # 3. 删除指标文件
echo "删除指标文件..." echo -e "${BLUE}删除指标文件...${NC}"
if [ -f "${METRICS_FILE}" ]; then if [ -f "${METRICS_FILE}" ]; then
rm -f "${METRICS_FILE}" rm -f "${METRICS_FILE}"
echo "已删除指标文件: ${METRICS_FILE}" echo -e "${GREEN}已删除指标文件: ${METRICS_FILE}${NC}"
else else
echo "指标文件不存在,跳过" echo -e "${YELLOW}指标文件不存在,跳过${NC}"
fi fi
# 4. 删除日志文件 # 4. 删除日志文件
echo "删除日志文件..." echo -e "${BLUE}删除日志文件...${NC}"
if [ -f "${LOG_FILE}" ]; then if [ -f "${LOG_FILE}" ]; then
rm -f "${LOG_FILE}" rm -f "${LOG_FILE}"
echo "已删除日志文件: ${LOG_FILE}" echo -e "${GREEN}已删除日志文件: ${LOG_FILE}${NC}"
else else
echo "日志文件不存在,跳过" echo -e "${YELLOW}日志文件不存在,跳过${NC}"
fi fi
# 5. 重启node_exporter # 5. 重启node_exporter
restart_node_exporter restart_node_exporter
# 6. 验证结果 # 6. 验证结果
echo "===== 卸载完成 =====" echo -e "${YELLOW}===== 卸载完成 =====${NC}"
echo "node_exporter状态: $(systemctl is-active "${NODE_EXPORTER_SERVICE}" 2>/dev/null || echo "未安装")" echo -e "${BLUE}node_exporter状态:${NC} $(systemctl is-active "${NODE_EXPORTER_SERVICE}" 2>/dev/null || echo -e "${YELLOW}未安装${NC}")"
} }
# 主逻辑 # 主逻辑
@ -216,7 +223,7 @@ check_root
# 参数检查 # 参数检查
if [ $# -ne 1 ]; then if [ $# -ne 1 ]; then
echo "错误: 必须指定--install或--uninstall" >&2 echo -e "${RED}错误: 必须指定--install或--uninstall${NC}" >&2
show_help show_help
exit 1 exit 1
fi fi
@ -234,8 +241,8 @@ case "$1" in
exit 0 exit 0
;; ;;
*) *)
echo "错误: 未知参数 '$1'" >&2 echo -e "${RED}错误: 未知参数 '$1'${NC}" >&2
show_help show_help
exit 1 exit 1
;; ;;
esac esac