#!/usr/bin/env bash # 安装 systemd 服务,实现 zTools2 持久化部署(开机自启 + 崩溃自动重启)。 # # 做的事: # 1. 用实际路径填充 deploy/ztools2.service 模板,写入 /etc/systemd/system/ # 2. 停掉旧方式(start.sh 启动的 uvicorn),避免端口冲突 # 3. systemctl daemon-reload + enable + start # # 用法:./deploy/install-systemd.sh # 卸载:systemctl disable --now ztools2 && rm /etc/systemd/system/ztools2.service && systemctl daemon-reload set -euo pipefail cd "$(dirname "$0")/.." ROOT="$(pwd)" # 解析 uvicorn 可执行路径:优先 .venv(setup.sh 标准),回退系统 python -m uvicorn if [[ -x "$ROOT/.venv/bin/uvicorn" ]]; then UVICORN="$ROOT/.venv/bin/uvicorn" PYBIN="$ROOT/.venv/bin/python" elif command -v uvicorn >/dev/null 2>&1; then UVICORN="$(command -v uvicorn)" PYBIN="$(command -v python3)" else echo "未找到 uvicorn:请先运行 ./setup.sh(建 .venv)或 pip install uvicorn" >&2 exit 1 fi [[ -f "$ROOT/config.yaml" ]] || { echo "未找到 config.yaml,请先运行 ./setup.sh" >&2; exit 1; } UNIT_SRC="$ROOT/deploy/ztools2.service" UNIT_DST="/etc/systemd/system/ztools2.service" echo "==> 生成 systemd unit(路径 $ROOT,uvicorn=$UVICORN)" # 同时填充 ROOT 与 UVICORN;PYBIN 备用(ExecStart 用 UVICORN 直接启动) sudo sed -e "s|__ZTOOLS2_DIR__|$ROOT|g" -e "s|__UVICORN__|$UVICORN|g" "$UNIT_SRC" > /tmp/ztools2.service sudo mv /tmp/ztools2.service "$UNIT_DST" sudo chmod 644 "$UNIT_DST" echo "==> 停止旧方式(start.sh 启动的进程,若有)" ./stop.sh >/dev/null 2>&1 || true echo "==> 启用并启动 ztools2 服务" sudo systemctl daemon-reload sudo systemctl enable ztools2 sudo systemctl restart ztools2 sleep 2 if systemctl is-active --quiet ztools2; then echo "✓ ztools2 已启动并设为开机自启" echo " 状态:systemctl status ztools2" echo " 日志:journalctl -u ztools2 -f" echo " 停止:sudo systemctl stop ztools2" echo " 重启:sudo systemctl restart ztools2" else echo "✗ ztools2 启动失败,查看日志:journalctl -u ztools2 -n 50" >&2 exit 1 fi