#!/bin/bash #======================================================================= # FILE: scripts/clean-data.sh # DESC: 清理目标板卡 (RK3588 / Ubuntu 22.04) 上的数据库与日志文件。 # 默认清理板卡运行目录 /root/work/h100/data/ 下的: # power_data.db (+ -wal/-shm) 主机功率数据库 # feedback_data.db 反馈落盘数据库 # pccu_data.db (+ -wal/-shm) pCCU 帧日志数据库 # pCanBridge_data.db (+ -wal/-shm) pCanBridge CAN 帧数据库 # pPowerManger.log / pCCU.log 运行日志 # 默认先停止各服务再清理(避免 SQLite WAL 仍在写入)。 # # 用法: # ./scripts/clean-data.sh # 停服务 -> 清理 data 目录(不重启) # ./scripts/clean-data.sh --start # 清理后重新启动各服务 # ./scripts/clean-data.sh --no-stop # 不停服务直接清理(慎用) # ./scripts/clean-data.sh --stale # 额外清理 bin/ 与 src/bin/ 下的旧 db/log # # 参数: # --host 目标主机(默认 192.168.0.223) # --user 登录用户(默认 root) # --board-dir 板卡部署根目录(默认 /root/work/h100) # --start 清理后重启服务 # --no-stop 不停服务直接清理(慎用) # --stale 额外清理历史遗留的 bin/、src/bin/ 下旧数据库与日志 # -h, --help 显示帮助 # # 前置: 板卡已配免密 SSH(ssh-copy-id root@)。 #======================================================================= set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")" HOST="192.168.0.223" USER="root" BOARD_DIR="/root/work/h100" DO_START=0 DO_STOP=1 DO_STALE=0 SERVICES=(moosdb pPowerManger pPowerMangerHost pCCU pCanBridge) # 板卡 data 目录下需要清理的文件(含 SQLite WAL/SHM) DATA_FILES=( power_data.db power_data.db-wal power_data.db-shm feedback_data.db pccu_data.db pccu_data.db-wal pccu_data.db-shm pCanBridge_data.db pCanBridge_data.db-wal pCanBridge_data.db-shm pPowerManger.log pCCU.log ) # 历史遗留目录(旧部署位置),仅当 --stale 时清理 STALE_DIRS=("${BOARD_DIR}/bin" "${BOARD_DIR}/src/bin") info() { printf '\033[1;36m[clean-data]\033[0m %s\n' "$*"; } ok() { printf '\033[1;32m[clean-data]\033[0m %s\n' "$*"; } warn() { printf '\033[1;33m[clean-data]\033[0m %s\n' "$*"; } err() { printf '\033[1;31m[clean-data]\033[0m %s\n' "$*"; } usage() { sed -n '2,31p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' exit 0 } #------------------------------------------------------------------- # 参数解析 #------------------------------------------------------------------- while [ $# -gt 0 ]; do case "$1" in --host) [ $# -ge 2 ] || { err "--host 需要参数"; exit 1; }; HOST="$2"; shift 2 ;; --user) [ $# -ge 2 ] || { err "--user 需要参数"; exit 1; }; USER="$2"; shift 2 ;; --board-dir) [ $# -ge 2 ] || { err "--board-dir 需要参数"; exit 1; }; BOARD_DIR="$2"; shift 2 ;; --start) DO_START=1; shift ;; --no-stop) DO_STOP=0; shift ;; --stale) DO_STALE=1; shift ;; -h|--help) usage ;; *) err "未知参数: $1(见 --help)"; exit 1 ;; esac done STALE_DIRS=("${BOARD_DIR}/bin" "${BOARD_DIR}/src/bin") SSH_TARGET="${USER}@${HOST}" SSH="ssh -o BatchMode=yes -o ConnectTimeout=5" #------------------------------------------------------------------- # 1. 前置检查 #------------------------------------------------------------------- if ! ${SSH} "${SSH_TARGET}" 'true' 2>/dev/null; then err "无法免密 SSH 到 ${SSH_TARGET}" err "请先配置免密登录: ssh-copy-id ${SSH_TARGET}" exit 1 fi ok "SSH 连接正常: ${SSH_TARGET}" #------------------------------------------------------------------- # 2. 停止服务(默认) #------------------------------------------------------------------- if [ "${DO_STOP}" = "1" ]; then info "停止服务 ${SERVICES[*]} ..." # 先停应用,最后停 moosdb ${SSH} "${SSH_TARGET}" "systemctl stop pCanBridge pPowerMangerHost pPowerManger pCCU moosdb 2>/dev/null; true" ok "服务已停止" else warn "--no-stop:不停服务直接清理,可能产生脏数据(SQLite 仍在写入)" fi #------------------------------------------------------------------- # 3. 清理 data 目录 #------------------------------------------------------------------- BOARD_DATA="${BOARD_DIR}/data" info "清理 ${BOARD_DATA}/ ..." for f in "${DATA_FILES[@]}"; do ${SSH} "${SSH_TARGET}" "rm -f ${BOARD_DATA}/${f}" \ && ok "删除 ${f}" || warn "删除 ${f} 失败(可能不存在)" done #------------------------------------------------------------------- # 4. 可选: 清理历史遗留目录 #------------------------------------------------------------------- if [ "${DO_STALE}" = "1" ]; then for d in "${STALE_DIRS[@]}"; do info "清理历史遗留 ${d}/ 下的 db/log ..." ${SSH} "${SSH_TARGET}" "rm -f ${d}/power_data.db ${d}/power_data.db-wal ${d}/power_data.db-shm ${d}/feedback_data.db ${d}/pPowerManger.log 2>/dev/null; true" ok "${d} 已清理" done fi #------------------------------------------------------------------- # 5. 可选: 重启服务 #------------------------------------------------------------------- if [ "${DO_START}" = "1" ]; then info "启动服务 (moosdb -> pPowerManger / pPowerMangerHost / pCCU / pCanBridge) ..." ${SSH} "${SSH_TARGET}" "systemctl start moosdb && sleep 1 && \ systemctl start pPowerManger pPowerMangerHost pCCU pCanBridge" \ || { err "启动失败"; exit 1; } ok "服务已启动" else echo "" info "清理完成,服务未启动。需要重启请加 --start 或手动:" echo " systemctl start moosdb pPowerManger pPowerMangerHost pCCU pCanBridge" fi echo "" ok "完成。"