用Liunx service方式管理SuperMap iServer

该文章已生成可运行项目,

查阅iServer最新帮助文档https://help.supermap.com/iServer/zh/Appendix/WindowsService.htm发现只有windows注册为系统服务的脚本,生成环境中最常用的linux环境反而没有,预计写了和iserver linux服务文件,发现每次手动修改还是比较麻烦,于是在ai的帮助下编写了下面这个iServer服务注册脚本,可实现service自动注册,覆盖和卸载提示,检测是否为root用户等。

使用方法如下:

1. 拷贝service.sh文件到iServer的bin目录

2. 给service.sh添加执行执行权限

# 给脚本添加执行权限
chmod +x ./service.sh

3. 命令执行

# 安装服务
sudo ./service.sh -install

# 卸载服务
sudo ./service.sh -uninstall

4. 执行效果

4.1. 服务安装(覆盖安装需要确认并备份配置)

4.2. 查看服务

4.3. 卸载服务

5. 脚本下载地址:

https://yanggh.lanzouq.com/iNZHs39qunna

6. 脚本

#!/bin/bash

# 固定服务名称
SERVICE_NAME="supermap-iserver"

# 获取当前脚本所在目录的父目录作为ISERVER_HOME
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ISERVER_HOME="${SCRIPT_DIR%/bin}"

# 服务文件路径
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"

# 显示使用说明
show_usage() {
    echo "使用方法: $0 [-install | -uninstall]"
    echo ""
    echo "选项:"
    echo "  -install    安装SuperMap iServer服务"
    echo "  -uninstall  卸载SuperMap iServer服务"
    echo ""
    echo "当前检测到的iServer路径: $ISERVER_HOME"
}

# 用户确认函数
confirm_action() {
    local message="$1"
    local default="${2:-n}"
    
    if [ "$default" = "y" ]; then
        prompt="[Y/n]"
    else
        prompt="[y/N]"
    fi
    
    while true; do
        read -p "$message $prompt " answer
        case "${answer:-$default}" in
            [Yy]* ) return 0 ;;
            [Nn]* ) return 1 ;;
            * ) echo "请输入 y 或 n";;
        esac
    done
}

# 验证iServer目录结构
validate_iserver_home() {
    if [ ! -f "$ISERVER_HOME/bin/startup.sh" ]; then
        echo "错误: 在 $ISERVER_HOME 中未找到iServer的启动脚本"
        echo "请确保脚本在iServer的bin目录中运行"
        return 1
    fi
    return 0
}

# 备份现有服务配置
backup_service_config() {
    if [ -f "$SERVICE_FILE" ]; then
        local backup_file="${SERVICE_FILE}.backup.$(date +%Y%m%d%H%M%S)"
        cp "$SERVICE_FILE" "$backup_file"
        echo "已备份现有服务配置到: $backup_file"
    fi
}

# 安装服务
install_service() {
    echo "开始安装SuperMap iServer服务..."
    
    # 验证目录结构
    if ! validate_iserver_home; then
        return 1
    fi
    
    # 检查服务是否已存在
    if [ -f "$SERVICE_FILE" ]; then
        echo "警告: 服务文件已存在,安装将覆盖现有配置!"
        echo "当前服务配置将被备份,但服务设置会被新配置替换。"
        
        if ! confirm_action "确定要覆盖现有服务配置吗?" "n"; then
            echo "安装已取消"
            return 1
        fi
        
        # 备份现有配置
        backup_service_config
        
        # 停止并禁用现有服务
        echo "停止现有服务..."
        systemctl stop "$SERVICE_NAME" 2>/dev/null || true
        systemctl disable "$SERVICE_NAME" 2>/dev/null || true
    fi
    
    # 创建systemd服务文件
    echo "创建服务文件: $SERVICE_FILE"
    cat > "$SERVICE_FILE" << EOF
[Unit]
After=network.target
Description=$ISERVER_HOME
Documentation=https://help.supermap.com/iServer/zh/index.htm

[Service]
Environment="ISERVER_HOME=$ISERVER_HOME"
ExecStart=/bin/sh -c 'cd \${ISERVER_HOME}/bin/ && ./startup.sh'
ExecStop=/bin/sh -c 'cd \${ISERVER_HOME}/bin/ && ./shutdown.sh'
PrivateTmp=true
Restart=on-failure
TimeoutStartSec=10
Type=forking
User=root

[Install]
WantedBy=multi-user.target
EOF
    
    # 重新加载systemd配置
    systemctl daemon-reload
    
    # 启用服务
    systemctl enable "$SERVICE_NAME"
    
    echo "服务安装完成!"
    echo "服务名称: $SERVICE_NAME"
    echo "安装路径: $ISERVER_HOME"
    echo ""
    echo "使用以下命令管理服务:"
    echo "启动服务: systemctl start $SERVICE_NAME"
    echo "停止服务: systemctl stop $SERVICE_NAME"
    echo "查看状态: systemctl status $SERVICE_NAME"
    echo "查看日志: journalctl -u $SERVICE_NAME -f"
}

# 卸载服务
uninstall_service() {
    echo "开始卸载SuperMap iServer服务..."
    
    # 检查服务是否存在
    if [ ! -f "$SERVICE_FILE" ]; then
        echo "错误: 服务文件 $SERVICE_FILE 不存在"
        echo "可能服务未安装或服务名称不匹配"
        return 1
    fi
    
    # 检查服务状态
    local service_status=$(systemctl is-active "$SERVICE_NAME" 2>/dev/null || echo "not-found")
    if [ "$service_status" = "active" ]; then
        echo "警告: 服务当前正在运行,卸载将立即停止服务!"
    fi
    
    if ! confirm_action "确定要立即停止服务并卸载吗?" "n"; then
        echo "卸载已取消"
        return 1
    fi
    
    # 停止服务
    echo "停止服务..."
    systemctl stop "$SERVICE_NAME" 2>/dev/null || true
    
    # 禁用服务
    echo "禁用服务..."
    systemctl disable "$SERVICE_NAME" 2>/dev/null || true
    
    # 备份服务配置
    backup_service_config
    
    # 删除服务文件
    echo "删除服务文件..."
    rm -f "$SERVICE_FILE"
    
    # 重新加载systemd配置
    systemctl daemon-reload
    systemctl reset-failed
    
    echo "服务卸载完成!"
    echo "已卸载的服务: $SERVICE_NAME"
    echo "原安装路径: $ISERVER_HOME"
    echo ""
    echo "注意: 此操作仅卸载systemd服务,iServer文件仍保留在原位置"
}

# 主程序
main() {
    if [ $# -ne 1 ]; then
        show_usage
        exit 1
    fi
    
    case "$1" in
        -install|--install)
            install_service
            ;;
        -uninstall|--uninstall)
            uninstall_service
            ;;
        *)
            echo "错误: 未知参数 '$1'"
            show_usage
            exit 1
            ;;
    esac
}

# 检查是否以root权限运行
check_root() {
    if [ "$EUID" -ne 0 ]; then
        echo "错误: 此脚本需要root权限运行"
        echo "请使用: sudo $0 $*"
        exit 1
    fi
}

# 执行主程序
check_root "$@"
main "$@"
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值