[轉載]jps

今天在測試機上tmp目錄下刪除了幾個文件,而後發現datanode上jps無進程顯示,而namenode上有,因而比較二者發現datanode上的/tmp/hsperfdata_root 被誤刪了,沒辦法只能重啓集羣。看來對於集羣的實際運用還有很長一段路要走啊。java

知其然也要知其因此然。node

特此從其餘地方摘錄了jps相關的信息作個記錄。linux

原文連接:http://trinea.iteye.com/blog/1196400ubuntu

 

一、jps的做用windows

jps相似linux的ps命令,不一樣的是ps是用來顯示進程,而jps只顯示java進程,準確的說是當前用戶已啓動的部分java進程信息,信息包括進程號和簡短的進程command。jvm

二、某個java進程已經啓動,用jps卻顯示不了該進程進程號工具

這個問題已經碰到過兩次了,因此在這裏總結下。測試

現象:pwa

用ps -ef|grep java能看到啓動的java進程,可是用jps查看卻不存在該進程的id。待會兒解釋過以後就能知道在該狀況下,jconsole、jvisualvm可能沒法監控該進程,其餘java自帶工具也可能沒法使用blog

 

分析:

java程序啓動後,默認(請注意是默認)會在/tmp/hsperfdata_userName目錄下以該進程的id爲文件名新建文件,並在該文件中存儲jvm運行的相關信息,其中的userName爲當前的用戶名,/tmp/hsperfdata_userName目錄會存放該用戶全部已經啓動的java進程信息。對於windows機器/tmp用Windows存放臨時文件目錄代替。

而jps、jconsole、jvisualvm等工具的數據來源就是這個文件(/tmp/hsperfdata_userName/pid)。因此當該文件不存在或是沒法讀取時就會出現jps沒法查看該進程號,jconsole沒法監控等問題

 

緣由:

(1)、磁盤讀寫、目錄權限問題

若該用戶沒有權限寫/tmp目錄或是磁盤已滿,則沒法建立/tmp/hsperfdata_userName/pid文件。或該文件已經生成,但用戶沒有讀權限

 (2)、臨時文件丟失,被刪除或是按期清理

對於linux機器,通常都會存在定時任務對臨時文件夾進行清理,致使/tmp目錄被清空。這也是我第一次碰到該現象的緣由。經常使用的可能定時刪除臨時目錄的工具爲crontab、redhat的tmpwatch、ubuntu的tmpreaper等等

這個致使的現象可能會是這樣,用jconsole監控進程,發如今某一時段後進程仍然存在,可是卻沒有監控信息了。

 (3)、java進程信息文件存儲地址被設置,不在/tmp目錄下

上面咱們在介紹時說默認會在/tmp/hsperfdata_userName目錄保存進程信息,但因爲以上一、2所述緣由,可能致使該文件沒法生成或是丟失,因此java啓動時提供了參數(-Djava.io.tmpdir),能夠對這個文件的位置進行設置,而jps、jconsole都只會從/tmp目錄讀取,而沒法從設置後的目錄讀物信息,這是我第二次碰到該現象的緣由

關於設置該文件位置的參數爲-Djava.io.tmpdir

 

其餘:

/tmp/hsperfdata_userName/pid文件會在對應java進程退出後被清除。若是java進程非正常退出(如kill -9),那麼pid文件會被保留,直到執行一次java命令或是加載了jvm程序的命令(如jps、javac、jstat),會將全部無用的pid文件都清除掉

相關文章
相關標籤/搜索