关于Linux平台下/tmp下文件被清理探索

昨天使用./bin/graceful_stop.sh bighad1停止一台hbase regionserver节点失败,log如下所示:
2016-07-21 14:25:59,580 INFO  [main] zookeeper.ZooKeeper: Client environment:user.dir=/home/chris/hbase-0.98.7-hadoop2/bin
2016-07-21 14:25:59,581 INFO [main] zookeeper.ZooKeeper: Initiating client connection, connectString=10.0.41.94:2181,10.0.55.56:2181,10.0.59.225:2181 sessionTimeout=90000 watcher=hconnection-0x661261ba, quorum=10.0.41.94:2181,10.0.55.56:2181,10.0.59.225:2181, baseZNode=/hbase
2016-07-21 14:25:59,603 INFO [main-SendThread(10.0.59.225:2181)] zookeeper.ClientCnxn: Opening socket connection to server 10.0.59.225/10.0.59.225:2181. Will not attempt to authenticate using SASL (unknown error)
2016-07-21 14:25:59,610 INFO [main-SendThread(10.0.59.225:2181)] zookeeper.ClientCnxn: Socket connection established to 10.0.59.225/10.0.59.225:2181, initiating session
2016-07-21 14:25:59,617 INFO [main-SendThread(10.0.59.225:2181)] zookeeper.ClientCnxn: Session establishment complete on server 10.0.59.225/10.0.59.225:2181, sessionid = 0x3500747e7e6841d, negotiated timeout = 40000
RuntimeError: Server bighad1:60020 not online
stripServer at /home/chris/hbase-0.98.7-hadoop2/bin/region_mover.rb:225
unloadRegions at /home/chris/hbase-0.98.7-hadoop2/bin/region_mover.rb:336
(root) at /home/chris/hbase-0.98.7-hadoop2/bin/region_mover.rb:515
2016-07-21T06:26:00 Unloaded bighad1 region(s)
2016-07-21T06:26:00 Stopping regionserver
no regionserver to stop because no pid file /tmp/hbase-root-regionserver.pid
2016-07-21T06:26:00 Restoring balancer state to
从日记中很容易看出来,no pid file  /tmp/hbase-root-regionserver.pid没有这个pid文件(默认如果不在hbase-env.sh文件中指定pid文件存放目录的话,默认是在/tmp下):
# The directory where pid files are stored. /tmp by default.
# export HBASE_PID_DIR=/var/hadoop/pids

这是hbase-env.sh默认的设置。
现在问题很显而易见,就是hbase reregionserver node的pid文件被删除了。那为什么会被删除呢?下面给大家介绍一下/tmp目录,以及在Linux下的清理机制。
 
Linux下/tmp目录,通常被大家叫做临时目录,而且文件夹里面的文件会被清空,那系统默认多长时间清空的,是怎么清空的呢,下面给大家介绍一下,也记录一下我的这次学习过程。
 
在Centos/RHEL/Fedora系统下存在清理机制(Ubuntu下没有,我的系统是Centos6.5)
有时候开发习惯性的将一些临时文件放在tmp目录下,让其自然删除。同时,为了保证tmp目录不爆满,系统默认情况下每日会处理一次tmp目录文件,原理就是使用了tmpwatch。然后可能好多开源的应用程序如Mysql、HDFS、HBSE的开发者,也有这种习惯。其实如果开发者对系统有这种机制概念的话,我想他不会把一些PID文件目录默认设置到/tmp下面,然后很多开源的软件程序都是由国外的开发者发起的,并且Ubuntu系统在国外深受开发者喜欢,所以可能这个问题在他们那就ok了。如果你是在Centos下最小化安装的,默认是没有tmpwatch命令的。
 
安装:
yum install tmpwatch

tmpwatch命令,他的作用就是删除一段时间内不使用的文件(removes files which haven’t been accessed for a period of time)。 
 
安装后会在/etc/cron.daily/目录下生成一个tmpwatch文件。内容如下:
#! /bin/sh
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 \
-X '/tmp/hsperfdata_*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
if [ -d "$d" ]; then
/usr/sbin/tmpwatch "$flags" -f 30d "$d"
fi
done
从脚本中可看出,tmp目录会删除10天未访问过的文件。

我们看看/usr/sbin/tmpwatch "$flags" 30d /var/tmp这一行,关键的是这个30d,就是30天的意思,这个就决定了30天清理/var/tmp下不访问的文件。如果说,你想一天一清理的话,就把这个30d改成1d。可以DIY!
 
但有个问题需要注意,如果你设置更短的时间来清理的话,比如说是30分钟、10秒等等,你可以在这个文件中设置,但你会发现重新电脑,他不清理/tmp文件夹里面的内容,这是为什么呢?这就是tmpwatch他所在的位置决定的,他的上层目录是/etc/cron.daily/,而这个目录是第天执行一次计划任务,所以说,你设置了比一天更短的时间,他就不起作用了。
 
所以结论是:在Centos6中,系统自动清理/tmp文件夹的默认时限是30天,其他系统待考证!
 
在Debian\Ubuntu系统中(Ubuntu 12.04.2 LTS 为实验环境)
上面我说到在Ubuntu下没有tmpwatch清理机制,但是在Ubuntu系统中,在/tmp文件夹里面的内容,每次开机都会被清空,如果不想让他自动清理的话,只需要更改rcS文件中的TMPTIME的值。 
 
修改:
# sudo vi /etc/default/rcS
TMPTIME=0

#change set -1
TMPTIME=-1或者是无限大
把 TMPTIME=0修改成 TMPTIME=-1或者是无限大,改成这样的话,系统在重新启动的时候就不会清理你的/tmp目录了。 依些类推,如果说要限制多少时间来更改的话,就可以改成相应的数字(本人没有测试,我是这么理解的)
 
所以结论是:在Ubuntu中,系统自动清理/tmp文件夹的时限默认每次启动
 
tmpwatch工具介绍
tmpwatch工具从指定的目录中递归地搜索并删除指定的目录中一段时间未访问的文件。

tmpwatch参数说明:
-u, --atime 基于访问时间来删除文件,默认的。
-m, --mtime 基于修改时间来删除文件。
-c, --ctime 基于创建时间来删除文件,对于目录,基于mtime。
-M, --dirmtime 删除目录基于目录的修改时间而不是访问时间。
-a, --all 删除所有的文件类型,不只是普通文件,符号链接和目录。
-d, --nodirs 不尝试删除目录,即使是空目录。
-d, --nosymlinks 不尝试删除符号链接。
-f, --force 强制删除。
-q, --quiet 只报告错误信息。
-s, --fuser 如果文件已经是打开状态在删除前,尝试使用“定影”命令。默认不启用。
-t, --test 仅作测试,并不真的删除文件或目录。
-U, --exclude-user=user 不删除属于谁的文件。
-v, --verbose 打印详细信息。
-x, --exclude=path 排除路径,如果路径是一个目录,它包含的所有文件被排除了。如果路径不存在,它必须是一个绝对路径不包含符号链接。
-X, --exclude-pattern=pattern 排除某规则下的路径。
对于Mysql、HDFS、HBASE等应用,如果将pid和socket文件创建在tmp目录下,要将这两个文件排除在外,否则mysql重启或使用socket文件登录时,提示找不到文件。

0 个评论

要回复文章请先登录注册