我的環境的zookeeper目錄為/opt/app/zk,假設我想以zookeeper使用者啟動
以下示例,在/etc/systemd/system/檔案夾下建立一個啟動腳本zookeeper.service
[Unit]
Description=zookeeper
After=syslog.target network.target
[Service]
Type=forking
Environment=ZOO_LOG_DIR=/opt/app/zk/log
ExecStart=/opt/app/zk/bin/zkServer.sh start
ExecStop=/opt/app/zk/bin/zkServer.sh stop
Restart=always
User=zookeeper
Group=zookeeper
[Install]
WantedBy=multi-user.target
以上腳本重點内容在于Environment=ZOO_LOG_DIR=/opt/app/zk/log
為什麼要給ZOO_LOG_DIR指派呢?
打開bin/zkEnv.sh,搜尋ZOO_LOG_DIR,你會發現下面這段
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
ZOO_LOG_DIR="."
這段腳本的意思是說ZOO_LOG_DIR如果未指定,則它的值為你啟動zookeeper時的目前目錄,而bin/zkServer.sh啟動時又是先調用zkEnv.sh,然後建立一個${ZOO_LOG_DIR}/zookeeper.out日志檔案,如果此時剛好普通使用者對該目錄沒有建立檔案的權限,則啟動時就會報錯,具體錯誤就是zookeeper.out...permison denied
是以我們利用Environment=ZOO_LOG_DIR=/opt/app/zk/log這條語句主動給ZOO_LOG_DIR指派(或者你直接在zkEnv.sh或zkServer.sh指定ZOO_LOG_DIR的值也是可以的),然後将zookeeper的目錄賦權給普通使用者:
chown -R zookeeper.zookeeper /opt/app/zk
啟動zookeeper:
systemctl start zookeeper
加入開機啟動:
systemctl enable zookeeper
OK,搞定
轉載于:https://blog.51cto.com/kusorz/1920778