将安装脚本和服务文件合并成一个文件
This commit is contained in:
Executable
+166
@@ -0,0 +1,166 @@
|
||||
#!/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
|
||||
@@ -1,26 +0,0 @@
|
||||
[Unit]
|
||||
Description=Weather Station Serial Receiver
|
||||
After=network-online.target
|
||||
Wants=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=/home/arch/script/weather-station-receive
|
||||
ExecStart=/bin/bash /home/arch/script/weather-station-receive/receive.sh
|
||||
|
||||
# 自动重启
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
# 防止无限重启:60 秒内超过 3 次则停止
|
||||
StartLimitInterval=60
|
||||
StartLimitBurst=3
|
||||
|
||||
# 日志输出到 journald
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=weather-station
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
Reference in New Issue
Block a user