zookeeper-配置systemctl系统启动

1、 Systemd 服务文件‌ sudo vi /etc/systemd/system/zookeeper.service 更新为以下内容(根据实际路径调整): [Unit] Description=Apache ZooKeeper Service After=network.target [S

1、 Systemd 服务文件

sudo vi /etc/systemd/system/zookeeper.service

更新为以下内容(根据实际路径调整):

[Unit]
Description=Apache ZooKeeper Service
After=network.target

[Service]
Type=forking
# 使用专用用户(需提前创建)
User=zookeeper
Group=zookeeper
# 设置 Java 环境变量(关键修复)
Environment="JAVA_HOME=/usr/local/jdk1.8.0_291"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# 指定 ZooKeeper 启动脚本路径
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
Restart=on-failure
RestartSec=10s
WorkingDirectory=/opt/zookeeper
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

2. 创建专用用户并授权

# 创建用户和组 
sudo useradd -r -s /bin/false zookeeper 
# 授权 ZooKeeper 目录 
sudo chown -R zookeeper:zookeeper /opt/zookeeper

‌3. 重新加载配置并重启服务

sudo systemctl daemon-reload 
sudo systemctl restart zookeeper 
sudo systemctl status zookeeper

  1. 配置shell脚本

#!/bin/bash
set -e

# 配置参数(根据实际环境修改)
ZOOKEEPER_DIR="/opt/zookeeper"
SERVICE_USER="root"
SERVICE_GROUP="root"
SYSTEMD_FILE="/etc/systemd/system/zookeeper.service"

# 检查 root 权限
if [ "$(id -u)" -ne 0 ]; then
  echo "错误:请使用 sudo 或 root 用户运行此脚本"
  exit 1
fi

# 函数:通过 whereis 查找 Java 路径
detect_java_home() {
  # 获取 whereis 输出并过滤有效路径
  local java_paths=($(whereis java | awk '{print $2}'))
  
  # 遍历所有找到的路径
  for java_bin in "${java_paths[@]}"; do
    # 跳过非二进制文件(如手册页)
    if [[ "$java_bin" == *"/man/"* ]] || [ ! -x "$java_bin" ]; then
      continue
    fi

    # 解析真实路径
    local real_path=$(readlink -f "$java_bin")
    if [[ "$real_path" == */jre/bin/java ]]; then
      JAVA_HOME="${real_path%/jre/bin/java}"
    elif [[ "$real_path" == */bin/java ]]; then
      JAVA_HOME="${real_path%/bin/java}"
    fi

    # 验证 JAVA_HOME 有效性
    if [ -n "$JAVA_HOME" ] && [ -f "$JAVA_HOME/bin/java" ]; then
      echo "检测到 Java 路径: $JAVA_HOME"
      return 0
    fi
  done

  echo "错误:未找到有效的 Java 安装"
}

# 执行 Java 检测
detect_java_home

# 检查 ZooKeeper 安装
if [ ! -f "$ZOOKEEPER_DIR/bin/zkServer.sh" ]; then
  echo "错误:ZooKeeper 启动脚本不存在 $ZOOKEEPER_DIR/bin/zkServer.sh"
  exit 1
fi

## 创建专用用户
#if ! id "$SERVICE_USER" &>/dev/null; then
#  echo "创建用户和组: $SERVICE_USER:$SERVICE_GROUP"
#  useradd -r -s /bin/false -U "$SERVICE_USER"
#fi

## 设置目录权限
#echo "配置目录权限: $ZOOKEEPER_DIR"
#chown -R "$SERVICE_USER:$SERVICE_GROUP" "$ZOOKEEPER_DIR"

# 生成 Systemd 服务文件
echo "创建 Systemd 服务文件: $SYSTEMD_FILE"
cat > "$SYSTEMD_FILE" << EOF
[Unit]
Description=Apache ZooKeeper Service
After=network.target

[Service]
Type=forking
User=$SERVICE_USER
Group=$SERVICE_GROUP
Environment="JAVA_HOME=$JAVA_HOME"
Environment="PATH=\$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ExecStart=$ZOOKEEPER_DIR/bin/zkServer.sh start
ExecStop=$ZOOKEEPER_DIR/bin/zkServer.sh stop
Restart=on-failure
RestartSec=10s
WorkingDirectory=$ZOOKEEPER_DIR
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

# 启用并启动服务
echo "配置开机启动 & 启动服务..."
systemctl daemon-reload
systemctl enable zookeeper
systemctl restart zookeeper

# 验证结果
echo -e "\n服务状态:"
systemctl status zookeeper --no-pager

echo -e "\n操作完成!管理命令:"
echo "启动服务   : systemctl start zookeeper"
echo "停止服务   : systemctl stop zookeeper"
echo "查看日志   : journalctl -u zookeeper -f"
echo "开机启动状态: systemctl is-enabled zookeeper"

LICENSED UNDER CC BY-NC-SA 4.0
Comment