Files

167 lines
5.4 KiB
Bash
Executable File

#!/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" <<EOF
[Unit]
Description=Weather Station Serial Receiver
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=${SCRIPT_DIR}
ExecStart=/bin/bash ${TARGET_SCRIPT}
# 自动重启
Restart=always
RestartSec=10
# 防止无限重启:60 秒内超过 3 次则停止
StartLimitInterval=60
StartLimitBurst=3
# 日志输出到 journald
StandardOutput=journal
StandardError=journal
SyslogIdentifier=weather-station
[Install]
WantedBy=multi-user.target
EOF
chmod 0644 "$DST_SERVICE"
}
#-------------------------------------------------------------------------------
# 前置检查:receive.sh 是否存在、可执行
#-------------------------------------------------------------------------------
preflight() {
if [[ ! -f "$TARGET_SCRIPT" ]]; then
echo "[错误] 找不到接收脚本: $TARGET_SCRIPT"
exit 1
fi
if [[ ! -x "$TARGET_SCRIPT" ]]; then
echo "[信息] 为 receive.sh 添加可执行权限..."
chmod +x "$TARGET_SCRIPT"
fi
}
#-------------------------------------------------------------------------------
# 安装:写出 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