进程管理程序java,运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析...
運維經驗分享作為一個專題,目前共7篇文章
====================================分割線======================================
ChatterServer 之所以有如此多版和遇到這么多問題,跟java進程還有很大的關系,此次面臨的問題和分析思路總結如下,歡迎各位補充。
停止java進程可能面臨的問題:以kill pid的方式停止java進程,java進程在等待java進程內部結束,因此沒有立即結束,從而導致原java程序監聽的端口可能沒有釋放,原java進程的pid也可能依然存在
在原java進程沒有立即結束的情況下,再重新啟動這個java進程就會產生錯誤,這些錯誤包括無法重新監聽端口,甚至是直接啟動失敗
啟動java進程可能面臨的問題:
用java命令啟動java進程,java進程返回結果為成功,但實際不成功(需要注意確認“用java命令啟動java進程”返回的執行結果是java自身返回的,還是人工編寫的程序返回的)
上面描述的一些進一步解釋、術語和例子:java進程是指由人工編寫的一些java程序,其中不能保證程序里面的異常全部捕獲并處理,例如如果無法監聽端口返回正確的錯誤返回值并退出
以kill pid的方式:kill `cat $PIDFILE`
用java命令啟動java進程:java -jar somename.jar $ARGS
原有的啟動java進程的流程啟動進程有兩種情況,第一次啟動(首次啟動),停止進程后再次啟動(重新啟動),因此可以考慮將這兩種情況綜合在一起考慮,即不區分之前是否啟動過或停止過,把這些情況都考慮進去
判斷當前系統中的特定目錄下是否存在pid文件或者鎖
判斷當前系統中是否已經存在java進程,判斷的依據是從系統中檢測java進程pid是否存在,如ps,而不是根據pid文件或者鎖判斷
判斷當前系統中是否已經監聽端口號,因為端口號可能由別的程序(如果pid不存在,則該端口號不會由它自己占用)占用
啟動java進程(大部分程序都會保證此處能啟動成功,可參考/etc/init.d/functions,行270,1-8),如果返回結果為成功,則輸出成功并創建pid文件和鎖,如果不成功,則輸出不成功,不再嘗試再次啟動
原有的停止java進程的流程如果找到pid,先發送TERM信號,暫停100000微秒(usleep 100000),如果人工預先知道需要繼續延遲,則延遲自定義秒數,如果沒有殺死(即依然能檢測到系統中存在此pid)則再發送KILL信號,再次暫停100000微秒
再次檢測到系統中是否存在此pid,如果不存在則輸出成功并移除pid文件和鎖,如果存在則輸出不成功
如果找不到pid,則輸出程序沒有在運行
根據以上問題重新設計啟動java進程的流程(主要問題所在)啟動進程有兩種情況,第一次啟動(首次啟動),停止進程后再次啟動(重新啟動),因此可以考慮將這兩種情況綜合在一起考慮,即不區分之前是否啟動過或停止過,把這些情況都考慮進去
判斷當前系統中的特定目錄下是否存在pid文件(原有設計中沒有鎖,故此處不使用鎖)
判斷當前系統中是否已經存在java進程,判斷的依據是從系統中檢測java進程pid是否存在,如test -d /proc/$pid,ps,而不是根據pid文件或者鎖判斷
判斷當前系統中是否已經監聽端口號,因為端口號可能由別的程序(如果pid不存在,則該端口號不會由它自己占用)占用
啟動java進程(大部分程序都會保證此處能啟動成功,可參考/etc/init.d/functions,行270,1-8),如果返回結果為成功,從系統中檢測java進程pid是否存在,如果pid存在則輸出成功并創建pid文件(原有設計中沒有鎖,故此處不使用鎖),如果pid不存在,則再次啟動java進程,移除“如果不成功,則輸出不成功,不再嘗試再次啟動”。
根據以上問題重新設計停止java進程的流程針對java進程沒有殺死的可能性,現做出如此修改,如果找到pid,先發送TERM信號,暫停100000微秒(usleep 100000),已經預先知道需要繼續延遲,延遲5秒,如果沒有殺死(即依然能檢測到系統中存在此pid)則再發送KILL信號,再次暫停100000微秒
再次檢測到系統中是否存在此pid,如果不存在則輸出成功并移除pid文件(原有設計中沒有鎖,故此處不使用鎖),如果pid依然存在則再嘗試kill -9(The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.當前假設認為-9比kill更加強制)
如果找不到pid,則輸出程序沒有在運行
--end--
====================================分割線======================================
運維經驗分享作為一個專題,目前共7篇文章
總結
以上是生活随笔為你收集整理的进程管理程序java,运维经验分享(四)--关于 java进程管理的服务控制脚本编程思路分析...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序基础:数据结构(郝斌讲解)(一)
- 下一篇: 程序基础:数据结构(郝斌讲解)(2)