#!/bin/bash #=============================================================================== # 气象站接收服务 一体化脚本 # - 内嵌 systemd service 定义,无需单独的 .service 文件 # - 安装 / 卸载 / 状态 / 重启 # 用法: # sudo ./install-service.sh # 安装 + 启用 + 启动(默认) # sudo ./install-service.sh install # 同上 # sudo ./install-service.sh uninstall # 停止 + 禁用 + 删除 service # sudo ./install-service.sh status # 查看运行状态 # sudo ./install-service.sh restart # 重启服务 #=============================================================================== set -uo pipefail SERVICE_NAME="weather-station-receiver" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TARGET_SCRIPT="${SCRIPT_DIR}/receive.sh" DST_SERVICE="/etc/systemd/system/${SERVICE_NAME}.service" ACTION="${1:-install}" #------------------------------------------------------------------------------- # 必须以 root 运行 #------------------------------------------------------------------------------- check_root() { if (( EUID != 0 )); then echo "[错误] 请使用 root 运行: sudo $0 $ACTION" exit 1 fi } #------------------------------------------------------------------------------- # 内嵌的 systemd service 单元文件 # WorkingDirectory / ExecStart 使用脚本所在目录,移动目录后重新安装即可 #------------------------------------------------------------------------------- write_service_file() { cat > "$DST_SERVICE" < daemon-reload -> enable -> start #------------------------------------------------------------------------------- do_install() { echo "========================================" echo " 安装气象站接收服务" echo "========================================" preflight echo "[1/5] 生成 service 文件 -> $DST_SERVICE" write_service_file echo "[2/5] 重新加载 systemd" systemctl daemon-reload echo "[3/5] 启用开机自启" systemctl enable "$SERVICE_NAME" echo "[4/5] 启动服务" systemctl restart "$SERVICE_NAME" echo "[5/5] 运行状态:" systemctl --no-pager --full status "$SERVICE_NAME" || true echo "========================================" echo " 安装完成" echo " 查看日志: journalctl -u $SERVICE_NAME -f" echo "========================================" } #------------------------------------------------------------------------------- # 卸载:stop -> disable -> remove -> daemon-reload #------------------------------------------------------------------------------- do_uninstall() { echo "========================================" echo " 卸载气象站接收服务" echo "========================================" echo "[1/4] 停止服务" systemctl stop "$SERVICE_NAME" 2>/dev/null || true echo "[2/4] 禁用开机自启" systemctl disable "$SERVICE_NAME" 2>/dev/null || true echo "[3/4] 删除 service 文件" rm -f "$DST_SERVICE" echo "[4/4] 重新加载 systemd" systemctl daemon-reload systemctl reset-failed "$SERVICE_NAME" 2>/dev/null || true echo "========================================" echo " 卸载完成" echo "========================================" } #------------------------------------------------------------------------------- # 状态 #------------------------------------------------------------------------------- do_status() { systemctl --no-pager --full status "$SERVICE_NAME" || true echo echo "开机自启: $(systemctl is-enabled "$SERVICE_NAME" 2>/dev/null || echo '未知')" echo "当前状态: $(systemctl is-active "$SERVICE_NAME" 2>/dev/null || echo '未知')" } #------------------------------------------------------------------------------- # 重启 #------------------------------------------------------------------------------- do_restart() { systemctl restart "$SERVICE_NAME" do_status } #------------------------------------------------------------------------------- # 主入口 #------------------------------------------------------------------------------- check_root case "$ACTION" in install) do_install ;; uninstall) do_uninstall ;; status) do_status ;; restart) do_restart ;; *) echo "用法: sudo $0 {install|uninstall|status|restart}" exit 1 ;; esac