前言
由於使用windows自動的自啓方法,不管是將程序啓動服務放到開機自啓文件夾中,還是創建任務計劃程序,都沒有很好的實現程序的開機自啓效果,而WinSW很好的解決了這個問題。
下載
WinSW下載地址
注意:不同版本,有些配置是不一樣的,比如我用的這個版本log mode就棄用了rotate模式,推薦使用roll模式。
這裏我用的版本是: v2.12.0。
配置介紹
配置的話其實在下載的那兩個xml文件中就有介紹到,翻譯着看也能懂的,這裏再介紹一下比較常用的。
sample-allOptions.xml
包含此版本的全部配置說明,文檔不長,介紹的也很詳細。
sample-minimal.xml
給出一個最簡單的示例配置,臨時用用就夠了。
<service> <id>Minio-Server</id> <name>Minio-Server</name> <description>這個服務的描述</description> <env name="HOME" value="%BASE%"/> <env name="MY_TOOL_HOME" value="C:\etc\tools\myTool" /> <env name="LM_LICENSE_FILE" value="host1;host2" /> <depend>service_id1</depend> <depend>service_id2</depend> <startmode>Automatic</startmode> <delayedAutoStart/> <!-- 要執行的可執行文件 --> <executable>%BASE%\xxx.exe</executable> <!-- 可執行文件傳遞的參數 --> <arguments>server "%BASE%\data"</arguments> <stopexecutable>%BASE%\xxx.exe -s stop</stopexecutable> <stoparguments>server "%BASE%\data"</stoparguments> <!-- <logmode>rotate</logmode> --> <logpath>%BASE%\logs</logpath> <log mode="roll-by-size-time"> <sizeThreshold>10240</sizeThreshold> <pattern>yyyyMMdd</pattern> <autoRollAtTime>00:00:00</autoRollAtTime> <zipOlderThanNumDays>5</zipOlderThanNumDays> <zipDateFormat>yyyyMMdd</zipDateFormat> </log> </service>
關於日誌的的配置詳細說明: 支持模式: append - Rust更新現有日誌; none -不將可執行日誌保存到磁盤; reset -在啓動時擦除日誌文件; roll-基於大小的滾動日誌; roll-by-time-根據時間滾動日誌; rotate -根據大小輪換日誌,(8個日誌,每個10MB)。此模式已棄用,請使用"roll".
roll模式的默認配置:
<!--工作方式類似於追加模式, 但除此之外,如果日誌文件的大小超過了設定的大小, 它將滾轉到myapp.1.out.log、myapp.2.out.log等等。 嵌套的<sizeThreshold>元素指定以KB爲單位的旋轉閾值(默認爲10MB), 嵌套的<keepFiles>元素指定要保留的滾動文件的數量(默認爲8)。--> <log mode="roll-by-size"> <sizeThreshold>10240</sizeThreshold> <keepFiles>8</keepFiles> </log>
roll-by-time配置:按日誌文件時間段滾動
<!--必須嵌套pattern標籤指定日誌文件名的時間標記格式,例如yyyyMMdd HH:mm--> <log mode="roll-by-time"> <pattern>yyyyMMdd</pattern> </log>
roll-by-size-time配置:按日誌文件大小和時間模式滾動
<!--嵌套sizeThreshold標籤指定日誌文件多大時生成新日誌文件,單位爲KB 嵌套pattern標籤指定當日誌文件文件名最後的區分字段格式(時間格式,如yyyyMMdd HH:mm) 嵌套autoRollAtTime標籤指定每天在指定時間進行日誌滾,例如00:00:00表示每天凌晨進行日誌滾動--> <log mode="roll-by-size-time"> <sizeThreshold>10240</sizeThreshold> <pattern>yyyyMMdd</pattern> <autoRollAtTime>00:00:00</autoRollAtTime> </log>
具體參考官方文檔:log配置項說明及示例
可能有些配置文檔中和官方給的下載xml中不一樣,比如這個log mode參數,官方給的xml就沒提到過roll-by-size-time這個配置,但是文檔中有,其實也可以用。
示例
jar包啓動示例
<service> <!-- 服務唯一ID --> <id>imApiId</id> <!-- 服務名稱--> <name>imApiService</name> <!-- 服務描述--> <description>this is im api,author:chaodev</description> <executable>java</executable> <arguments>-jar imApi.jar</arguments> <!-- 開機啓動 --> <startmode>Automatic</startmode> <!-- 日誌配置 --> <logpath>%BASE%\logs</logpath> <logmode>roll</logmode> </service>
注意:
id:唯一標識,我設爲jar包的名稱
name:服務中展示的名字
description:服務描述
executable:java 或 jdk路徑
arguments:執行的命令和jar包路徑,我這因爲jar包和xml在一個目錄,可以直接寫jar包名,路徑沒給出也可以,給路徑時,需要加雙引號,ru:"d:/ff/xxx.jar"。
啓動註冊服務:在xxx.exe當前目錄中進入cmd ,執行xxxexe install,服務中就註冊成功了
擴展:補償兩個手動啓動的bat腳本:
1. 後臺啓動
# @echo off %1 mshta vbscript:CreateObject("WScript.Shell").Run("%~s0 ::",0,FALSE)(window.close)&&exit java -jar C:\Users\Administrator\Desktop\aa\jnpf-admin-3.4.5-RELEASE.jar > imApiLog.log 2>&1 & exit
後臺啓動,啓動日誌及後續訪問日誌(相當於控制檯輸出日誌),顯示在腳本中設置的imApiLog.log中; 關閉服務: netstat -ano|findstr 8088 # 根據端口號查進程 taskkill /f /pid 13968 # 根據進程id殺進程(/f:強制結束該進程以及所有子進程)
2. dos窗口啓動
@echo off & setlocal EnableDelayedExpansion title xxxx服務 for %%a in (8080) do ( set pid=0 for /f "tokens=2,5" %%b in ('netstat -ano ^| findstr ":%%a"') do ( set temp=%%b for /f "usebackq delims=: tokens=1,2" %%i in (`set temp`) do ( if %%j==%%a ( taskkill /f /pid %%c set pid=%%c echo 端口號【%%a】相關進程已殺死 ) else ( echo 不是本機佔用端口【%%a】 ) ) ) if !pid!==0 ( echo 端口號【%%a】沒有佔用 ) java -Xms1024m -Xmx1024m -Dfile.encoding=utf-8 -jar xxx.jar ) echo 操作完成 pause
安裝服務
將前邊準備好的xml文件及下載的WinSW程序拷貝到需要配置開機自啓的程序文件夾,根據需求重命名這兩個文件,注意保持兩個文件名一致
。
注意:
id:唯一標識,我設爲jar包的名稱
name:服務中展示的名字
description:服務描述
executable:java 或 jdk路徑
arguments:執行的命令和jar包路徑,我這因爲jar包和xml在一個目錄,可以直接寫jar包名,路徑沒給出也可以,給路徑時,需要加雙引號,ru:"d:/ff/xxx.jar"。
啓動註冊服務:在imNginxService.exe當前目錄中進入cmd ,輸入 imNginxService.exe install 回車,服務中就註冊成功了
執行指令
執行命令: 安裝服務: WinSW-x64.exe install 卸載服務: WinSW-x64.exe uninstall 啓動服務: WinSW-x64.exe start 停止服務: WinSW-x64.exe stop 重啓服務: WinSW-x64.exe restart 檢查服務狀態: WinSW-x64.exe status 刷新服務屬性而不是重新安裝: WinSW-x64.exe refresh
參考鏈接: