起因:
我時常需要查看一些Windows Service的狀態,每次使用控制台->服務這種方式來查看服務狀態不僅浪費時間而且也很無聊,乾脆寫個Ruby指令碼吧。讓Ruby指令碼來通知我某個Windows Service的狀態是如何,並根據狀態給我一些提示。
主要內容:
你可以從本篇daily works with ruby中看到以下技術/工具的使用。
- 使用RubyGems來查詢,安裝Gem包。
- Ruby中查詢Windows服務狀態。
- Ruby中調用Windows API。
一,安裝 RubyGems
1,你可以去RubyForge下載最新的RubyGems。RubyGems是Ruby中使用的一種包管理中工具。當你安裝完RubyGems後,便可以使用gem命令來查詢安裝別的Ruby庫。下載完RubyGems安裝包的zip檔案解壓至:D:\Temp目錄下,執行如下命令,安裝RubyGems:
C:\Documents and Settings\Jerry>d:D:\>cd Temp\rubygems-1.3.1D:\Temp\rubygems-1.3.1>setup.rbmkdir -p C:/Ruby/lib/ruby/site_ruby/1.8mkdir -p C:/Ruby/bin
安裝完成後便可以使用RubyGems來查詢和安裝Ruby的gem包了。
二,安裝win32-service包
1,查詢
安裝RubyGems包管理器後,我們可以用gem命令來查詢和安裝ruby的gem包。我們訪問Windows服務時,需要用到wind32-service包,現在我們在命令列了鍵入以下命令進行查詢:
1 D:\Temp\rubygems-1.3.1>gem query -r -n service
2
3 *** REMOTE GEMS ***
4
5 actionservice (0.3.0)
6 actionwebservice (1.2.6)
7 ar_mailer_service (0.1.1)
8 contxtlservice (0.1.1)
9 dot_net_services (0.4.0, 0.3.0)
10 mongrel_service (0.3.4, 0.1)
11 ruby_service_helper (0.1.0)
12 servicemerchant (0.1.0)
13 win32-service (0.7.0)
14 win32_service_manager (0.1.3)
15
16 D:\Temp\rubygems-1.3.1>
gem query命令是查詢可用gem包的命令,你可以通過gem --help來得到更多的可用選項。
其中gem query -r -n service表示去遠端伺服器[-r選項]上尋找名稱[-n選項]為service的gem包。
在上面的13行中顯示了我們需要用到的包,即:win32-service。
2,安裝win32-service
執行如下命令安裝win32-service包:
1 D:\Temp\rubygems-1.3.1>gem install -r win32-service
2 Successfully installed win32-service-0.7.0-x86-mswin32-60
3 1 gem installed
4 Installing ri documentation for win32-service-0.7.0-x86-mswin32-60
5 Installing RDoc documentation for win32-service-0.7.0-x86-mswin32-60
6
7 D:\Temp\rubygems-1.3.1>
在安裝完win32-service之後,我們便可以查看win32-service的相關文檔及API說明了。
先從命令列執行:
1 D:\Soft\AutoHotkey104805>gem server
2 Starting gem server on http://localhost:8808/
之後我們就可以開啟瀏覽器訪問http://localhost:8808/,便可以訪問所有的Gem包的Documents。
三,編寫查詢Windows Service狀態指令碼
萬事俱備,只欠東風了。我們開始編寫指令碼。
#!/ruby/binrequire "win32/service"require "Win32API"include Win32if Service.exists?("WebClient") && Service.status("WebClient").current_state == "running" beep = Win32API.new('kernel32','Beep',['I']*2,'V') 5.times do beep.call(750,300) sleep(1) endend
這裡需要解釋一下的是第7行: beep = Win32API.new('kernel32','Beep',['I']*2,'V')
這裡我們申明了一個Windows API,其中Win32API.new方法有四個參數。
1,API所在動態連結程式庫的名稱,如user32,kernel32....
2,API的方法名稱。
3,傳入參數類型:兩個Integer類型的參數,常用的還有['P']-Pointer,['V']-void,['n']-number.
4,傳回值類型。
四,結語
利用RubyGems來查詢Ruby的庫很方便。 同樣地利用Ruby的一些模組,來調用Windows API完成特定任務也很簡單。
當遇到一些API不瞭解時,可以利用"gem server"命令開啟本地www服務查看相應Gem文檔。