jps jstat 命令失效的问题

来源:互联网 发布:神马软件站 编辑:程序博客网 时间:2024/06/04 19:13

这里以hadoop的进程为例,大家看做是普通java进程即可

1.tmpwatch

man tmpwatch可以看到
tmpwatch是用来删除一些上时间未使用的临时文件
NAME       tmpwatch  -  removes  files which haven’t been accessed for a period of       timeOPTIONS       -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/tmpfor d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do    if [ -d "$d" ]; then/usr/sbin/tmpwatch "$flags" -f 720 "$d"    fidone

该任务每天执行一次
这里看到-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-b02Java System Properties:java.runtime.name = Java(TM) SE Runtime Environmentsun.boot.library.path = /usr/java/jdk1.6.0_29/jre/lib/amd64java.vm.version = 20.4-b02。。。。。。。。。。。。。。。。file.encoding.pkg = sun.iosun.java.launcher = SUN_STANDARDuser.country = USsun.os.patch.level = unknownjava.vm.specification.name = Java Virtual Machine Specificationuser.dir = /home/hadoop/hadoopjava.runtime.version = 1.6.0_29-b11java.awt.graphicsenv = sun.awt.X11GraphicsEnvironmentjava.endorsed.dirs = /usr/java/jdk1.6.0_29/jre/lib/endorsedos.arch = amd64java.io.tmpdir = /tmpline.separator = 。。。。。。。。。。。。。。。。
。。。。。表示省略,其中注意红字部分
java.io.tmpdir = /tmp
这里表示java进程的临时输出目录
且会在/tmp/生成进程的pid文件,并且会生产/tmp/hsperfdata_用户名 目录
我这里是
hadoop-hadoop-jobtracker.pid     hsperfdata_roothadoop-hadoop-namenode.pid     Jetty_0_0_0_0_50030_job____yn7qmkhadoop-hadoop-secondarynamenode.pid  Jetty_0_0_0_0_50070_hdfs____w2cu08hsperfdata_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几个进程,因为一样找不到pid
hadoop里的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 Jps31749 JobTracker31664 SecondaryNameNode31498 NameNode

和hadoop的三个java进程一一对应

这里面放的就是jstat所需要的数据了

一旦删除jstat就无法使用,怎么样才能防止定时任务删除呢

你可能想到了文章开头的-d参数  

只需在tmpwatch脚本开头的-umc改为-umcd即可