關於在windows平臺下將應用製做成windows服務及服務依賴的感想

在某些狀況下,應用須要部署在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,執行窗體會要求輸入系統管理員密碼,輸入正確的密碼後便可自動安裝依賴。

安裝後可在服務列表中選擇指定服務右鍵點擊屬性,轉到依存關係便可看到,以下圖所示:

相關文章
相關標籤/搜索