jps命令&Linux的oom-kill&clean机制&PID文件(含实践踩坑)

jps(Java Virtual Machine Process Status Tool)是java提供的一个显示当前所有java进程pid的命令

1.首先查询下jps的路径

[root@hadoop001 /]# which jps
/usr/java/jdk1.8.0_45/bin/jps
java路径下 所以需要先配置好jdk

2. jps

抛出两个问题:
1.root用户是否能看到所有的进程信息
2.未显示的进程是否真的不存在

2.1 查看进程

首先我在wzj用户下启动了hadoop的进程

[wzj@hadoop001 ~]$ jps
4384 ResourceManager
4737 Jps
4483 NodeManager
4238 SecondaryNameNode
3935 NameNode
4063 DataNode

[root@hadoop001 /]# jps
4384 – process information unavailable
4483 – process information unavailable
4238 – process information unavailable
3935 – process information unavailable
4063 – process information unavailable
4815 Jps

问题一:所以root能看到进程,但是看不到信息,每个用户只能看到由自己启动的进程

2.2 进程位置

pid信息默认存放在 /tmp/hsperfdata_username文件中

[wzj@hadoop001 tmp]$ cd hsperfdata_wzj
[wzj@hadoop001 hsperfdata_wzj]$ ll
total 160
-rw-------. 1 wzj wzj 32768 Dec 7 14:44 3935
-rw-------. 1 wzj wzj 32768 Dec 7 14:45 4063
-rw-------. 1 wzj wzj 32768 Dec 7 14:45 4238
-rw-------. 1 wzj wzj 32768 Dec 7 14:45 4384
-rw-------. 1 wzj wzj 32768 Dec 7 14:45 4483
[wzj@hadoop001 hsperfdata_wzj]$ pwd
/tmp/hsperfdata_wzj
[wzj@hadoop001 hsperfdata_wzj]$ jps
4384 ResourceManager
4483 NodeManager
4845 Jps
4238 SecondaryNameNode
3935 NameNode
4063 DataNode

近下来进行一个进程信息移除的操作

[wzj@hadoop001 hsperfdata_wzj]$ ll
total 160
-rw-------. 1 wzj wzj 32768 Dec 7 14:48 3935
-rw-------. 1 wzj wzj 32768 Dec 7 14:48 4063
-rw-------. 1 wzj wzj 32768 Dec 7 14:48 4238
-rw-------. 1 wzj wzj 32768 Dec 7 14:48 4384
-rw-------. 1 wzj wzj 32768 Dec 7 14:48 4483
[wzj@hadoop001 hsperfdata_wzj]$ mv 4238 …/
[wzj@hadoop001 hsperfdata_wzj]$ ll
total 128
-rw-------. 1 wzj wzj 32768 Dec 7 14:48 3935
-rw-------. 1 wzj wzj 32768 Dec 7 14:49 4063
-rw-------. 1 wzj wzj 32768 Dec 7 14:48 4384
-rw-------. 1 wzj wzj 32768 Dec 7 14:48 4483
[wzj@hadoop001 hsperfdata_wzj]$ jps
4384 ResourceManager
4483 NodeManager
4887 Jps
3935 NameNode
4063 DataNode
[wzj@hadoop001 hsperfdata_wzj]$

可以看到jps查看已经看不到4238的进程存在了,但是真的不存在吗?

[wzj@hadoop001 hsperfdata_wzj]$ ps -ef|grep 4238 | grep -v grep | wc -l
1
[wzj@hadoop001 tmp]$ ll grep *.pid
ls: cannot access grep: No such file or directory
-rw-rw-r--. 1 wzj wzj 5 Dec  7 14:41 hadoop-wzj-datanode.pid
-rw-rw-r--. 1 wzj wzj 5 Dec  7 14:41 hadoop-wzj-namenode.pid
-rw-rw-r--. 1 wzj wzj 5 Dec  7 14:42 hadoop-wzj-secondarynamenode.pid
-rw-rw-r--. 1 wzj wzj 5 Dec  7 14:42 yarn-wzj-nodemanager.pid
-rw-rw-r--. 1 wzj wzj 5 Dec  7 14:42 yarn-wzj-resourcemanager.pid
[wzj@hadoop001 tmp]$ cat hadoop-wzj-secondarynamenode.pid 
4238
[wzj@hadoop001 tmp]$ 

查询4238进程的个数我们看到显示1,并且查询一下,确认是存在的,并且关闭进程也是正常的,所以需要注意,不论是shell脚本还是其它,减少使用jps,有时会有欺骗性,万能的ps -ef才是王道

3.linux的两种机制
3.1 oom-kill机制

介绍:OOM Killer的全称为Out of Memory (OOM) killer,它的作用简单点说就是,当系统的内存用光的时候,系统内核会自动的Kill掉一个或者一些进程,以使系统能继续的恢复到正常的运行状态

如果我们的进程突然断了,首先查看日志找EROOR,有ERROR具体分析,没有ERROR但是INFO信息断了,很可能就是触发了oom-killer机制,使用free -h命令查看内存使用情况,再使用cat /var/log/messages | grep oom命令查看有没有类似于Killed process 的命令,如果有,就是触发了oom-killer机制

[root@hadoop001 /]# cat /var/log/messages |grep oom

3.2 clean机制

clean机制: Linux的/tmp目录是一个临时目录,Linux会把/tmp目录下的文件以一定规则来自动清理掉,而用户根目录下面的tmp目录不会自动清理,前面使用jps命令的时候就发现,hadoop的进程pid都存放在/tmp目录中,启动进程的时候去/tmp目录下创建对应的pid文件,结束进程的时候去/tmp目录下找到程序对应的pid用来结束进程并删除pid文件,那么引申出来一个问题,如果我们的hadoop组件进程启动时间超过了定期清理时间,pid文件被清理,结束命令找不到pid号,会再重新创建一个pid,结果就是pid号紊乱,进程无法正常结束

所以两种方法,一种是设置为不清理,另一种是改变我们hadoop pid信息的存放位置

3.2.1查看清理规则

[wzj@hadoop001 tmp]$ cat /usr/lib/tmpfiles.d/tmp.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# See tmpfiles.d(5) for details

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp

v /tmp 1777 root root 10d 代表的是每十天会把/tmp自动清理掉

v:代表的是按照一定规则清理的文件

x:代表的是不会清理的文件

如果希望/tmp/hadoop相关的文件不想被清理掉,就使用x添加相关的配置

3.2.2 改变hadoop pid信息存放位置

vi hadoop-env.sh
export HADOOP_PID_DIR=/home/wzj/tmp

vi yarn-env.sh
export YARN_PID_DIR=/home/hadoop/tmp

踩坑

在写这篇博客的最后操作中踩了一个坑 导致搞了半个多小时
起因:修改pid信息存储路径的时候忘记停掉hadoop的相关进程,导致改完路径后,jps查看少一个进程
[wzj@hadoop001 ~]$ jps
10512 ResourceManager
10083 NameNode
10211 DataNode
10615 NodeManager
11166 Jps

但是在修改之后的路径下神奇的看到了他,而且还查到了进程号

[wzj@hadoop001 ~]$ cd tmp
[wzj@hadoop001 tmp]$ ll
total 20
-rw-rw-r–. 1 wzj wzj 6 Dec 7 15:51 hadoop-wzj-datanode.pid
-rw-rw-r–. 1 wzj wzj 6 Dec 7 15:51 hadoop-wzj-namenode.pid
-rw-rw-r–. 1 wzj wzj 6 Dec 7 15:51 hadoop-wzj-secondarynamenode.pid
-rw-rw-r–. 1 wzj wzj 6 Dec 7 15:51 yarn-wzj-nodemanager.pid
-rw-rw-r–. 1 wzj wzj 6 Dec 7 15:51 yarn-wzj-resourcemanager.pid
[wzj@hadoop001 tmp]$ cat hadoop-wzj-secondarynamenode.pid
10369

。。。。。。。。。。。。。。。。无语脸

瞎试中,准备kill一下,重点来喽,告诉我不存在

[wzj@hadoop001 tmp]$ kill -9 10369
-bash: kill: (10369) - No such process

少了secondarynamenode,还是去看它的日志吧

[wzj@hadoop001 logs]$ cat hadoop-wzj-secondarynamenode-hadoop001.log|grep ERROR
2017-09-05 15:22:02,117 ERROR org.apache.hadoop.hdfs.server.common.Storage: Unable to acquire file lock on path /tmp/hadoop-wzj/dfs/namesecondary/in_use.lock
2017-09-05 15:22:02,119 ERROR org.apache.hadoop.hdfs.server.common.Storage: It appears that another namenode 4238@hadoop001 has already locked the storage directory
2017-09-05 15:27:23,075 ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception in doCheckpoint
2017-09-05 15:28:19,310 ERROR org.apache.hadoop.hdfs.server.common.Storage: Unable to acquire file lock on path /tmp/hadoop-wzj/dfs/namesecondary/in_use.lock
2017-09-05 15:28:19,311 ERROR org.apache.hadoop.hdfs.server.common.Storage: It appears that another namenode 4238@hadoop001 has already locked the storage directory

能看到存在一个4238的secondarynamenode进程locked

top去看一下 kill kill kill kill kill 就是这个东西搞了我半天

重新启动,成功

[wzj@hadoop001 ~]$ jps
12273 NodeManager
12433 Jps
12028 SecondaryNameNode
12172 ResourceManager
11742 NameNode
11870 DataNode
[wzj@hadoop001 ~]$ cd tmp
[wzj@hadoop001 tmp]$ ll
total 20
-rw-rw-r–. 1 wzj wzj 6 Dec 7 16:15 hadoop-wzj-datanode.pid
-rw-rw-r–. 1 wzj wzj 6 Dec 7 16:15 hadoop-wzj-namenode.pid
-rw-rw-r–. 1 wzj wzj 6 Dec 7 16:15 hadoop-wzj-secondarynamenode.pid
-rw-rw-r–. 1 wzj wzj 6 Dec 7 16:15 yarn-wzj-nodemanager.pid
-rw-rw-r–. 1 wzj wzj 6 Dec 7 16:15 yarn-wzj-resourcemanager.pid

发布了45 篇原创文章 · 获赞 1 · 访问量 1764

猜你喜欢

转载自blog.csdn.net/wzj_wp/article/details/103435342