在某些情況下,應用需要部署在windows平台下,單純的手動點擊exe執行文件或java -jar xxx.jar在實際生產環境中不是最佳實踐(制作成bat啟動文件置於啟動項里,服務器啟動后,需要人工輸入登錄賬號才能啟動應用服務)。此時我們需要將應用制作成windows服務設為自啟動,這樣在windows服務器手動重啟或斷電啟動后,無需用戶手動輸入登錄賬號即可自動啟動應用服務,此外,應用還可能依賴第三方服務,即只有第三方服務啟動后,該應用才能正常啟動運行(比如大部分web應用依賴數據庫服務,redis內存數據庫服務等),這時考慮將應用設置為自動(延遲啟動)或設置服務依賴關系。下面將提供實際安裝腳本。
對於某些應用比如tomcat,redis等本身提供了windows服務安裝腳本,此時我們只需要按照使用方法安裝服務即可(后面會提供tomcat和redis的windows服務安裝腳本)。但對於大部分應用,比如nginx,大部分exe應用,我們需要借助第三方工具將其封裝為windows服務。這里筆者推薦使用winsw,在利用winsw將nginx封裝為windows服務過程中,筆者狠狠踩了兩個大坑,不過借助強大的互聯網共享精神,算是完美填補了大坑。好了,閑話少講,來點干貨。
tomcat服務安裝腳本service_install.bat:
@echo off D: cd D:\runtime\program\tomcat-8.0.43\bin service.bat install myWebApp :利用tomcat自身提供的service.bat文件輸入install serviceName 即可安裝為windows服務,同時可以通過修改service.bat文件做一些定制化的東西
tomcat服務卸載腳本service_uninstall.bat:
@echo off D: cd D:\runtime\program\tomcat-8.0.43\bin service.bat remove myWebApp
redis服務安裝腳本service_install.bar:
D: cd D:\runtime\support\Redis-x64-3.2.100\ redis-server.exe --service-install D:\runtime\support\Redis-x64-3.2.100\redis.windows-service.conf --service-name myRedis --loglevel verbose pause;
redis服務卸載腳本service_uninstall.bar:
D: cd D:\runtime\support\Redis-x64-3.2.100\
redis-server.exe --service-uninstall --service-name myRedis
pause;
下面介紹使用第三方工具winsw將應用程序封裝為windows服務
1.下載winsw.exe文件,點擊這里下載;
2.將winsw.exe文件復制到待封裝為windows服務的應用的根目錄中,重命名如myService.exe;
3.在該目錄中新建xml文件命名為myService.xml,內容根據不同的應用內容不同,下面列舉常見的應用。
3.1 nginx應用的myService.xml:
<service> <id>myNginx</id> <name>myNginx</name> <description>myNginx服務</description> <startmode>Automatic</startmode> <env name="HOME" value="D:\runtime\support\nginx-1.10.3"/> <executable>%HOME%\nginx.exe</executable> <logpath>%HOME%\logs</logpath> <logmode>roll</logmode> <depend></depend> <startargument>-p%HOME%</startargument> <stopargument>-s</stopargument> <stopargument>stop</stopargument> </service>
注意xml中的startargument中值-p后面不能有空格,stopargument分開寫,否則安裝好的服務會在啟動時報錯從而啟動不成功。這是筆者所采的坑
3.2 jar包應用的myService.xml:
<service> <id>myJarService</id> <name>myJarService</name> <description>myJarService服務</description> <startmode>Automatic</startmode> <executable>C:\Program Files\Java\jre1.8.0_121\bin\java.exe</executable> <logpath>D:\runtime\data\log</logpath> <logmode>roll</logmode> <depend>MySQL57</depend> <depend>myRedis</depend> <arguments>-jar myJarApp.jar</arguments> </service>
這和在cmd命令窗口中輸入執行命令 java.exe -jar myJarApp.jar 類似。其中,depend可以添加多個表示該應用依賴第三方服務,如上面的依賴mysql和redis服務,只有在mysql和redis啟動之后才會啟動該應用
3.3 常見exe應用的myService.xml:
<service> <id>myExeApp</id> <name>myExeApp</name> <description>myExeApp服務</description> <startmode>Automatic</startmode>
<executable>D:\runtime\program\\bin\myApp.exe</executable> <logpath>D:\runtime\data\log</logpath> <logmode>roll</logmode> <depend>MySQL57</depend> </service>
4.在同級目錄中創建service_install.bat,輸入如下命令:
D:\應用根目錄\myService.exe install pause;
雙擊service_install.bat即可安裝該服務。如果出現權限不足報錯,請選中service_install.bat右鍵選擇“以管理員身份運行”。
附帶服務卸載腳本service_uninstall.bat
D:\應用根目錄\myService.exe uninstall pause;
對於大部分應用,應用的啟動需要依賴第三方服務啟動之后才能啟動該應用,這時就需要為該服務創建依賴關系。對於winsw封裝的服務,可以在xml中的depend節點配置依賴。如果不采用winsw方式,則我們需要手動配置服務間的依賴,下面提供完整腳本。
假設serviceA依賴serviceB和serviceC。則腳本serviceAdepend.bat內容如下:
@echo off echo ================開始為ServiceA服務創建依賴關系================ ping -n 2 127.0.0.1>nul sc query serviceA>nul if errorlevel 1060 ( echo 尚未安裝serviceA服務,請先安裝該服務. goto end ) ping -n 2 127.0.0.1>nul sc query serviceB>nul if errorlevel 1060 ( echo 尚未安裝serviceB服務,請先安裝該服務.
goto end
)
ping -n 2 127.0.0.1>nul
sc query serviceC>nul
if errorlevel 1060 (
echo 尚未安裝serviceC服務,請先安裝該服務.
goto end
)
runas /noprofile /user:Administrator "sc config serviceA depend= serviceB/serviceC" :使用管理員Administrator為serviceA服務創建依賴關系
echo ================ServiceA服務依賴關系創建完成================
ping -n 8 127.0.0.1>nul
goto end
:end
pause
雙擊serviceAdepend.bat,執行窗體會要求輸入系統管理員密碼,輸入正確的密碼后即可自動安裝依賴。
安裝后可在服務列表中選擇指定服務右鍵點擊屬性,轉到依存關系即可看到,如下圖所示: