118 lines
3.5 KiB
Bash
118 lines
3.5 KiB
Bash
#!/bin/bash
|
||
|
||
SERVICES=("PyBot" "PyBot_Web")
|
||
|
||
echo "=============================="
|
||
echo "开始卸载 PyBot 系统服务"
|
||
echo "=============================="
|
||
|
||
# 检查是否以 root 权限运行(部分操作需要)
|
||
if [ "$EUID" -ne 0 ]; then
|
||
echo "⚠️ 某些操作可能需要 sudo 权限"
|
||
fi
|
||
|
||
for SERVICE in "${SERVICES[@]}"; do
|
||
echo ""
|
||
echo ">>> 处理服务: $SERVICE"
|
||
|
||
# 1. 停止服务
|
||
if systemctl is-active --quiet $SERVICE; then
|
||
echo "停止服务..."
|
||
sudo systemctl stop $SERVICE
|
||
sleep 2 # 等待服务完全停止
|
||
else
|
||
echo "服务未运行"
|
||
fi
|
||
|
||
# 2. 禁用开机自启
|
||
if systemctl is-enabled --quiet $SERVICE 2>/dev/null; then
|
||
echo "取消开机自启..."
|
||
sudo systemctl disable $SERVICE
|
||
else
|
||
echo "未启用开机自启"
|
||
fi
|
||
|
||
# 3. 删除 service 文件
|
||
SERVICE_FILE="/etc/systemd/system/${SERVICE}.service"
|
||
if [ -f "$SERVICE_FILE" ]; then
|
||
echo "删除服务文件: $SERVICE_FILE"
|
||
sudo rm -f "$SERVICE_FILE"
|
||
else
|
||
echo "未找到服务文件"
|
||
fi
|
||
|
||
# 4. 杀残留进程(更精确的匹配)
|
||
echo "检查残留进程..."
|
||
# 使用更精确的进程匹配方式,避免误杀其他进程
|
||
PIDS=$(pgrep -f "${SERVICE}\.py" 2>/dev/null || pgrep -f "python.*${SERVICE}" 2>/dev/null)
|
||
if [ -n "$PIDS" ]; then
|
||
echo "杀死残留进程: $PIDS"
|
||
sudo kill -15 $PIDS 2>/dev/null # 先尝试正常终止
|
||
sleep 2
|
||
# 如果进程仍然存在,强制终止
|
||
if ps -p $PIDS > /dev/null; then
|
||
sudo kill -9 $PIDS 2>/dev/null
|
||
fi
|
||
else
|
||
echo "无残留进程"
|
||
fi
|
||
|
||
done
|
||
|
||
# 5. 重载 systemd
|
||
echo ""
|
||
echo "重新加载 systemd..."
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl daemon-reexec
|
||
|
||
# 6. 可选清理日志和数据
|
||
echo ""
|
||
read -p "是否清理 PyBot 日志文件?(y/n): " CLEAN_LOG
|
||
if [ "$CLEAN_LOG" == "y" ] || [ "$CLEAN_LOG" == "Y" ]; then
|
||
echo "清理应用日志..."
|
||
rm -f ./resources/log/core.log
|
||
rm -f ./resources/log/app.log
|
||
echo "清理 journal 日志(保留1天)..."
|
||
sudo journalctl --vacuum-time=1d 2>/dev/null || echo "journalctl 清理跳过(可能无权限)"
|
||
fi
|
||
|
||
read -p "是否清理历史数据和缓存?(y/n): " CLEAN_DATA
|
||
if [ "$CLEAN_DATA" == "y" ] || [ "$CLEAN_DATA" == "Y" ]; then
|
||
echo "清理历史数据..."
|
||
rm -f ./resources/history/*.md
|
||
rm -f ./resources/JSON/*.json
|
||
echo "注意:配置文件已保留,如需删除请手动操作 config/ 目录"
|
||
fi
|
||
|
||
# 7. 可选:询问是否删除虚拟环境(如果存在)
|
||
if [ -d "venv" ] || [ -d ".venv" ]; then
|
||
read -p "是否删除 Python 虚拟环境?(y/n): " CLEAN_VENV
|
||
if [ "$CLEAN_VENV" == "y" ] || [ "$CLEAN_VENV" == "Y" ]; then
|
||
echo "删除虚拟环境..."
|
||
rm -rf venv .venv
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
echo "=============================="
|
||
echo "卸载完成 ✅"
|
||
echo "=============================="
|
||
echo ""
|
||
echo "📝 提示:"
|
||
echo " - 配置文件保留在 config/ 目录"
|
||
echo " - 如需完全删除项目,请手动删除整个项目文件夹"
|
||
echo " - Python 依赖包未卸载,如需要可运行: pip uninstall -r requirements.txt"
|
||
echo ""
|
||
|
||
# 8. 验证
|
||
for SERVICE in "${SERVICES[@]}"; do
|
||
echo "验证服务: $SERVICE"
|
||
if systemctl status $SERVICE 2>&1 | grep -q "could not be found"; then
|
||
echo " ✔ 服务已彻底删除"
|
||
else
|
||
echo " ⚠ 服务可能仍存在,请检查"
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "感谢使用 PyBot!👋" |