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
配置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"