將kafka或zookeeper安裝成windows的服務
方式一 使用nssm軟件進行配置:
1、先解壓好nssm這軟件,然后進入 D:\nssm-2.24\win64> 2、 .\nssm install 會彈出一個nssm service installer 3、 application path :E:\kafka_2.11-1.1.1\bin\windows\kafka-server-start.bat 4、 startup directory : E:\kafka_2.11-1.1.1\bin\windows 上面選擇后會自動選擇出來 5、 Arguments: E:\kafka_2.11-1.0.1\config\server.properties 6、然后記得寫服務名稱kafka就行了
配置zookeeper服務的時候,和kafka大體上是一致的
nssm停止服務的設置為默認設置如下:
經測試,在windows的服務管理中右鍵停止服務,觀察對應的java進程已經停止。
方式二 commons-daemon-1.0.15-bin-windows:
1)64位系統進入amd64目錄,復制 prunsrv.exe 到
2)復制 commons-daemon-1.0.15-bin-windows 目錄下 prunmgr.exe 到 zookeeper/bin目錄下
5.為Zookeeper配置環境變量
添加ZOOKEEPER_SERVICE,ZOOKEEPER_HOME兩個環境變量
ZOOKEEPER_SERVICE:服務名稱(不要有中文),我這里取的是,命名為zookeeper_service
ZOOKEEPER_HOME: 取zookeeper的目錄 :
這里可以不用在環境變量里設置,而是在下面步驟編寫的install.bat文件中設置上下文生效的環境變量
6.在zookeeper/bin目錄下創建:zkServerStop.cmd 文件(可以創建一個txt,然后將后綴改為.cmd即可)
內容如下:
@echo off setlocal TASKLIST /svc | findstr /c:"%ZOOKEEPER_SERVICE%" > %ZOOKEEPER_HOME%\zookeeper_svc.pid FOR /F "tokens=2 delims= " %%G IN (%ZOOKEEPER_HOME%\zookeeper_svc.pid) DO ( @set zkPID=%%G ) taskkill /PID %zkPID% /T /F del %ZOOKEEPER_HOME%/zookeeper_svc.pid endlocal
在實際操作過程中,發現使用上面的腳本並不起作用,不能停止服務。
因為無論是zookeeper還是kafka都是使用的java.exe進程啟動的,
所以本質上是要停止對應的java進程,下面的代碼是采用根據端口號獲取進程pid,然后kill掉pid的方式
@echo off rem 設置監聽的端口號,zookeeper默認端口號2181,kafka默認端口號9092 set port=2181 echo port : %port% for /f "usebackq tokens=1-5" %%a in (`netstat -ano ^| findstr %port%`) do ( if [%%d] EQU [LISTENING] ( set pid=%%e ) ) for /f "usebackq tokens=1-5" %%a in (`tasklist ^| findstr %pid%`) do ( set image_name=%%a ) echo now will kill process : pid %pid%, image_name %image_name% rem 根據進程ID,kill進程 taskkill /f /pid %pid%
7.在zookeeper/bin目錄下創建:install.bat
內容如下:
@echo off set BASEDIR=%CD% rem 設置程序名稱 set SERVICE_EN_NAME=zk_service set ZOOKEEPER_HOME=F:\zookeeper-3.6.1-binset SERVICE_CH_NAME=zookeeper_service set SRV=%ZOOKEEPER_HOME%\bin\prunsrv.exe rem 輸出信息 echo SERVICE_NAME: %SERVICE_EN_NAME% echo ZOOKEEPER_HOME: %ZOOKEEPER_HOME% rem 安裝 prunsrv.exe //RS//"%SERVICE_EN_NAME%" --DisplayName="Zookeeper (%SERVICE_EN_NAME%)" --Description="Zookeeper (%SERVICE_EN_NAME%)" --Startup=auto --StartMode=exe --StartPath=%ZOOKEEPER_HOME% --StartImage=%ZOOKEEPER_HOME%\bin\zkServer.cmd --StopPath=%ZOOKEEPER_HOME%\ --StopImage=%ZOOKEEPER_HOME%\bin\zkServerStop.cmd --StopMode=exe --StopTimeout=5 --LogPath=%ZOOKEEPER_HOME% --LogPrefix=zookeeper-wrapper --PidFile=zookeeper.pid --LogLevel=Info --StdOutput=auto --StdError=auto pause off
8.雙擊install.bat即可安裝服務,再去服務里面啟動即可
三 使用winsw.net
<configuration> <!-- ID of the service. It should be unique accross the Windows system--> <!-- id,name,修改成對應服務的名稱--> <id>ServerName</id> <!-- Display name of the service --> <name>ServerName</name> <!-- Service description --> <!-- 注釋信息--> <description>descMessage</description> <!--服務的工作目錄,可自行定義 %BASE%\ 指主目錄--> <env name="WORKING_DIR" value="%BASE%\Service" /> <!--指調用dotnet.exe所在路徑--> <env name="EXE_FILE" value="C:\Program Files\dotnet\dotnet.exe" /> <!-- Path to the executable, which should be started --> <executable>%EXE_FILE%</executable> <!--對應服務的dll文件名稱--> <arguments>Server.dll</arguments> <!-- 啟動參數 可自行定義其他的命令--> <!-- <startarguments></startarguments> --> <!-- 停止命令 --> <!-- <stopexecutable>%WORKING_DIR%\%EXE_FILE%</stopexecutable> <stoparguments>-s stop</stoparguments> --> <!-- 表示啟動時需要填寫賬號密碼 --> <!-- <serviceaccount> <domain>YOURDOMAIN</domain> <user>useraccount</user> <password>Pa55w0rd</password> <allowservicelogon>true</allowservicelogon> </serviceaccount> --> <!-- 表示第一次啟動延遲10s 第二次延遲20s ... --> <onfailure action="restart" delay="10 sec"/> <onfailure action="restart" delay="20 sec"/> <onfailure action="restart" /> <resetfailure>1 hour</resetfailure> <!-- 工作目錄 --> <workingdirectory>%WORKING_DIR%</workingdirectory> <!-- 優先級 : Normal, Idle, High, RealTime, BelowNormal, AboveNormal --> <priority>Normal</priority> <!-- 服務停止超時時間 --> <stoptimeout>15 sec</stoptimeout> <!-- 是否先關主線程(WinSW) --> <stopparentprocessfirst>false</stopparentprocessfirst> <!--啟動模式 --> <startmode>Automatic</startmode> <!-- 延遲啟動 --> <!--<delayedAutoStart/>--> <!-- 依賴關系 --> <!-- <depend>Eventlog</depend> <depend>W32Time</depend> --> <!-- 未知,不要改 --> <waithint>15 sec</waithint> <sleeptime>1 sec</sleeptime> <!-- 是否能跟桌面通訊 --> <!-- <interactive/> --> <!-- 日志的存儲路徑 --> <logpath>%BASE%\logs</logpath> <log mode="roll-by-size-time"> <sizeThreshold>10240</sizeThreshold> <pattern>yyyyMMdd</pattern> <autoRollAtTime>00:00:00</autoRollAtTime> <zipOlderThanNumDays>7</zipOlderThanNumDays> <zipDateFormat>yyyyMM</zipDateFormat> </log> </configuration>
在WinSW.net的文件下使用管理員身份進入命令窗口,通過命令注冊服務: WinSW.NET.exe install
WinSW.NET.exe uninstall : 卸載服務
參考地址: