apache Windows shell centos java 微软 google wordpress Android Python 程序员 Ubuntu 编程 mysql Firefox 开源 php linux 云计算 nginx

運維經驗分享(四)–關於 java進程管理的服務控制腳本編程思路分析

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,則輸出程序沒有在運行

延伸阅读

    评论