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