查阅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 "$@"
1868

被折叠的 条评论
为什么被折叠?



