1. 程式人生 > >jps jstat 命令失效的問題

jps jstat 命令失效的問題

這裡以hadoop的程序為例,大家看做是普通java程序即可

1.tmpwatch

man tmpwatch可以看到tmpwatch是用來刪除一些上時間未使用的臨時檔案
NAME
       tmpwatch  -  removes  files which haven’t been accessed for a period of
       time
OPTIONS
       -u, --atime
              Make  the  decision  about  deleting  a file based on the file’s
              atime (access time). This is the default.

              Note that the periodic updatedb file system scans keep the atime
              of directories recent.

       -m, --mtime
              Make  the  decision  about  deleting  a file based on the file’s
              mtime (modification time) instead of the atime.

       -c, --ctime
              Make the decision about deleting a  file  based  on  the  file’s
              ctime (inode change time) instead of the atime; for directories,
              make the decision based on the mtime.
       -d, --nodirs
              Do not attempt to remove directories, even if they are empty.

       -d, --nosymlinks
              Do not attempt to remove symbolic links.

這裡重點看-umc和-d 引數         -umc很清楚    訪問,修改,建立時間-d引數             不會刪除子目錄,即使是空的,也不會刪除符號連線

2./etc/cron.daily/tmpwatch

cat /etc/cron.daily/tmpwatch可以看到定時執行的tmpwatch任務
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
	-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix 240 /tmp
/usr/sbin/tmpwatch "$flags" 720 /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
	/usr/sbin/tmpwatch "$flags" -f 720 "$d"
    fi
done

該任務每天執行一次這裡看到-umc同時被設定,如果同時被設定,那麼取的是最大時間,時間以小時為單位-x表示需要跳過的路徑,這些路徑不會被刪除想必大家看明白這段指令碼了

3.jinfo

使用jinfo命令檢視一個程序
jinfo 30352
結果如下
Attaching to process ID 30352, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.4-b02
Java System Properties:

java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = /usr/java/jdk1.6.0_29/jre/lib/amd64
java.vm.version = 20.4-b02
。。。。。。。。。。。。。。。。
file.encoding.pkg = sun.io
sun.java.launcher = SUN_STANDARD
user.country = US
sun.os.patch.level = unknown
java.vm.specification.name = Java Virtual Machine Specification
user.dir = /home/hadoop/hadoop
java.runtime.version = 1.6.0_29-b11
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
java.endorsed.dirs = /usr/java/jdk1.6.0_29/jre/lib/endorsed
os.arch = amd64
java.io.tmpdir = /tmp
line.separator = 。。。。。。。。。。。。。。。。
。。。。。表示省略,其中注意紅字部分
java.io.tmpdir = /tmp
這裡表示java程序的臨時輸出目錄且會在/tmp/生成程序的pid檔案,並且會生產/tmp/hsperfdata_使用者名稱 目錄我這裡是
hadoop-hadoop-jobtracker.pid     hsperfdata_root
hadoop-hadoop-namenode.pid     Jetty_0_0_0_0_50030_job____yn7qmk
hadoop-hadoop-secondarynamenode.pid  Jetty_0_0_0_0_50070_hdfs____w2cu08
hsperfdata_hadoop     Jetty_0_0_0_0_50090_secondary____y6aanv
大家可以清楚的看到pid檔案,以及hsperfdata_hadoop目錄結合上面的tmpwatch就會明白,如果長時間執行,上述設定是240小時,也就是10天,以上目錄就會刪除

4.jps失效

pid刪除那麼jps命令就無法查詢到pid,其實這時候還在執行,在hadoop中呼叫stop_all.sh也會無法關閉hadoop幾個程序,因為一樣找不到pidhadoop裡的hadoop-env.sh檔案中,預設是關閉了的。刪除 # export HADOOP_PID_DIR=/var/hadoop/pids 前面的#
把路徑設定成你想要的路徑。
那麼pid就會輸出到你指定路徑,這樣就無需擔心jps失效的問題了。

5.jstat失效

我們先看下hsperfdata_hadoop是什麼
ls /tmp/hsperfdata_hadoop/

可以看到
31498  31664  31749
看起來象程序id,使用jps命令看下
31989 Jps
31749 JobTracker
31664 SecondaryNameNode
31498 NameNode
和hadoop的三個java程序一一對應這裡面放的就是jstat所需要的資料了一旦刪除jstat就無法使用,怎麼樣才能防止定時任務刪除呢你可能想到了文章開頭的-d引數  只需在tmpwatch指令碼開頭的-umc改為-umcd即可