shell监控java接口服务_Linux系统下Java通过shell脚本监控重启服务
簡介
最近運維人員提出需求,增加一個運維頁面, 查詢當前的業(yè)務進程信息包括:進程名稱、啟動命令、啟動時間、運行時間等,可以通過頁面點擊重啟按鈕,可以重啟后端的一系列系統(tǒng)進程。
思路
java程序獲取linux進程信息可以通過shell腳本獲取進程信息、通過讀取proc文件系統(tǒng)獲取進程信息。 但是為了系統(tǒng)的安全性、方便維護等角度出發(fā),更多的是java通過shell獲取和linux交互能力。
java程序中要執(zhí)行l(wèi)inux命令主要依賴2個類:Process和Runtime:
Process:
ProcessBuilder.start() 和 Runtime.exec 方法創(chuàng)建一個本機進程,并返回 Process 子類的一個實例, 該實例可用來控制進程并獲得相關(guān)信息。Process 類提供了執(zhí)行從進程輸入、執(zhí)行輸出到進程、等待進程完成、 檢查進程的退出狀態(tài)以及銷毀(殺掉)進程的方法。 創(chuàng)建進程的方法可能無法針對某些本機平臺上的特定進程很好地工作,比如,本機窗口進程,守護進程,Microsoft Windows 上的 Win16/DOS 進程,或者 shell 腳本。創(chuàng)建的子進程沒有自己的終端或控制臺。它的所有標準 io(即 stdin、stdout 和 stderr) 操作都將通過三個流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程。 父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。因為有些本機平臺僅針對標準輸入和輸出流提供有限的緩沖區(qū)大小, 如果讀寫子進程的輸出流或輸入流迅速出現(xiàn)失敗,則可能導致子進程阻塞,甚至產(chǎn)生死鎖。 當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續(xù)異步執(zhí)行子進程。 對于帶有 Process 對象的 Java 進程,沒有必要異步或并發(fā)執(zhí)行由 Process 對象表示的進程。
特別需要注意的是:
1,創(chuàng)建的子進程沒有自己的終端控制臺,所有標注操作都會通過三個流
(getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程(父進程可通過這些流判斷子進程的執(zhí)行情況)
2,因為有些本機平臺僅針對標準輸入和輸出流提供有限的緩沖區(qū)大小,如果讀寫子進程的輸出流或輸入流迅速出現(xiàn)失敗,
則可能導致子進程阻塞,甚至產(chǎn)生死鎖
特別需要注意:如果子進程中的輸入流,輸出流或錯誤流中的內(nèi)容比較多,最好使用緩存(注意上面的情況2)
Runtime
每個Java應用程序都有一個Runtime類實例,使應用程序能夠與其運行的環(huán)境相連接。可以通過getRuntime方法獲取當前運行時環(huán)境。 應用程序不能創(chuàng)建自己的Runtime類實例。
獲取進程信息
獲取進程的shell字符串 ps aux | grep procName| grep -v grep
java 調(diào)用shell 獲取進程信息
查詢所需的進程列表信息
重啟業(yè)務進程
為了解決在某個進程啟動失敗的時候,web端可以獲取到該進程的信息, 需要通過shell返回一個int值, 每個進程啟動結(jié)果占用1個bit位方式實現(xiàn),web端獲取結(jié)果后,解決返回的結(jié)果,然后判斷是否有進程啟動失敗。
首先準備好shell腳本,內(nèi)容如下:
總結(jié)
以上是生活随笔為你收集整理的shell监控java接口服务_Linux系统下Java通过shell脚本监控重启服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正能量个性签名大全
- 下一篇: java applet 缺陷_Java