在某些狀況下,應用須要部署在windows平臺下,單純的手動點擊exe執行文件或java -jar xxx.jar在實際生產環境中不是最佳實踐(製做成bat啓動文件置於啓動項裏,服務器啓動後,須要人工輸入登陸帳號才能啓動應用服務)。此時咱們須要將應用製做成windows服務設爲自啓動,這樣在windows服務器手動重啓或斷電啓動後,無需用戶手動輸入登陸帳號便可自動啓動應用服務,此外,應用還可能依賴第三方服務,即只有第三方服務啓動後,該應用才能正常啓動運行(好比大部分web應用依賴數據庫服務,redis內存數據庫服務等),這時考慮將應用設置爲自動(延遲啓動)或設置服務依賴關係。下面將提供實際安裝腳本。java
對於某些應用好比tomcat,redis等自己提供了windows服務安裝腳本,此時咱們只須要按照使用方法安裝服務便可(後面會提供tomcat和redis的windows服務安裝腳本)。但對於大部分應用,好比nginx,大部分exe應用,咱們須要藉助第三方工具將其封裝爲windows服務。這裏筆者推薦使用winsw,在利用winsw將nginx封裝爲windows服務過程當中,筆者狠狠踩了兩個大坑,不過藉助強大的互聯網共享精神,算是完美填補了大坑。好了,閒話少講,來點乾貨。mysql
tomcat服務安裝腳本service_install.bat:nginx
@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:web
@echo off D: cd D:\runtime\program\tomcat-8.0.43\bin service.bat remove myWebApp
redis服務安裝腳本service_install.bar:redis
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:sql
D: cd D:\runtime\support\Redis-x64-3.2.100\
redis-server.exe --service-uninstall --service-name myRedis
pause;
下面介紹使用第三方工具winsw將應用程序封裝爲windows服務數據庫
1.下載winsw.exe文件,點擊這裏下載;windows
2.將winsw.exe文件複製到待封裝爲windows服務的應用的根目錄中,重命名如myService.exe;tomcat
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,執行窗體會要求輸入系統管理員密碼,輸入正確的密碼後便可自動安裝依賴。
安裝後可在服務列表中選擇指定服務右鍵點擊屬性,轉到依存關係便可看到,以下圖所示: