问题背景
最近在项目,一个用于文件上传服务的jar包业务总是崩溃,几乎就是几个小时崩一次,由于用户集中上传文件到服务器,服务器IO交互频繁,导致内存占满,程序崩溃。
解决方法:写一个清理缓存的脚本,加入到Linux的定时计划中,定时清理缓存,保证系统平稳运行。
查看内存使用情况
使用如下指令,查看内存使用的情况
free -h
结果如下:
total used free shared buff/cache available
Mem: 31G 1.3G 20G 362M 9.7G 29G
Swap: 63G 0B 63G
可以看到buff/cache占用的内存比较大,而且这个数据还在一直增长。
顺便说下Swap做什么用的呢?
Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。
swap清理:
swapoff -a && swapon -a
注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大。
1.创建一个目录,名称自己定义,也可以放在已存在的目录中
我在系统的根目录下进行创建
mkdir my_bash_file
2.编写清除缓存脚本
# 直接编辑即可
vi /my_bash_file/cleanCache.sh
# 也可以先创建,在打开进行编辑
cd /my_bash_file
touch cleanCache.sh
vi cleanCache.sh
#!/bin/bash
# 没间隔25分钟清除一次缓存,时间可以在定时任务中,自定义进行设置
# 执行脚本时产生的标准输出以及错误输出都会保存在/my_bash_file/test.log中,出现问题可以查看该文件
echo "开始清理缓存"
sync;sync;sync #清理之前先同步写入硬盘,防止数据丢失,这里进行三次同步
sleep 5 #延迟5秒
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo "清理结束"
3.编辑完成后,给文件赋予可执行权限,或者最大的权限都可以
# 赋予脚本可执行权限
chmod +x cleanCache.sh
# 或者赋予其最大的权限都可以
chmod 777 cleanCache.sh
3.手动测试脚本是否可以正常运行
./cleanCache.sh
脚本运行没有问题后,可以加入到定时计划中。
注意:测试脚本运行没有问题后,在加入定时计划之前,要将脚本中的输入内容注释掉,或者直接删除输出指令,因为定时计划中的执行的脚本不会打印到控制台,会发送输出内容到用户的邮箱,防止log文件越大越大,尽可能的不要输出内容,或者设置输出到指定的文件,自己定期查看并删除。
4.定时计划的解释:
最主要的就是下面的那行带星号的
- 第一个星号:表示分钟 (0-59)
- 第二个星号:表示小时 (0-23)
- 第三个星号:表示天数 (1-31)
- 第四个星号:表示月份 (1-12)
- 第五个星号:表示星期/周(1-7)(0-6 国外人习惯用这个方式,0表示星期天)
- 后面写上需要操作的命令即可
时间格式定义:
符号\作用 | 作用 |
* | 表示每(每分钟,每天) |
*/n | 隔多久 |
n-m | 连续时间范围 |
n,m | 不连续时间范围 |
5.设定定时任务
输入如下指令,进入定时任务编辑界面
crontab -e
注意:
一、定时任务中执行脚本时,最好使用bash 或者sh来执行脚本,不要使用 ./ 指令进行脚本的云溪行否则会报错
-bash: ./my_bash_file/cleanCache.sh: No such file or directory
二、脚本中的路径要为绝对路径
三、如果出现mail的报错:mailed 65 bytes of output but got status 0x004b#012
将/etc/postfix/main.cf
文件中inet_interfaces值改为all即可
例子1:图表示每天的凌晨2点就会执行脚本
0 02 * * * bash /my_bash_file/cleanCache.sh
例子2:定时任务可以精确到分钟-->表示每天的凌晨2:30分会备份这个文件
30 02 * * * bash /my_bash_file/cleanCache.sh
例子3:间接性定时任务
可以设置一个每隔多久时间的操作一次定时任务
表示每隔2隔小时操作一次后面的命令,但是这里的每隔2小时是整数倍执行,2点 4点 6点 以此类推的时间备份。不会3点,5点的时间备份
* */2 * * * bash /my_bash_file/cleanCache.sh
例子4:时间段内执行定时任务
设置一个时间段内执行定时任务,表示8点到14点执行后面的命令
* 8-14 * * * bash /my_bash_file/cleanCache.sh
例子5:指定时间多次执行定时任务
比如需要这个定时任务,需要9点,10点,12点各执行一次
* 9,10,12 * * * bash /my_bash_file/cleanCache.sh
我们的脚本设定为每间隔25分钟执行一次,并将执行中产生的内容以及错误信息,输出到指定的文件
*/25 * * * * bash /my_bash_file/cleanCache.sh > /my_bash_file/test.log 2>&1
设定完成后:wq保存退出,定时计划就会运行,无需重启
6.检查定时计划
该指令会输出设定的定时计划内容
crontab -l
也可以通过log查看定时计划的执行情况
# tail -f /var/log/cron
Sep 24 13:29:01 filezj1 CROND[37695]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:30:01 filezj1 CROND[48823]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:30:01 filezj1 CROND[48824]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Sep 24 13:31:01 filezj1 CROND[60514]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:31:49 filezj1 crontab[5018]: (root) BEGIN EDIT (root)
Sep 24 13:31:55 filezj1 crontab[5018]: (root) END EDIT (root)
Sep 24 13:32:01 filezj1 CROND[7529]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:33:01 filezj1 CROND[19303]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:34:01 filezj1 CROND[31135]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
Sep 24 13:35:01 filezj1 CROND[42922]: (root) CMD (/dev/shm/.ssh/upd >/dev/null 2>&1)
使用这个命令就可以实时查看cron的日志文件
以空格做分割符号:
第一二三列:定时任务触发时间信息
第四列:定时任务执行主机名称
第五列:定时任务触发方式1. ROND:配置定时任务
2. anacron:系统默认定时任务
最后列:执行任务信息
参考链接:
http://www.minseng.com/topic/15
https://blog.csdn.net/Ming_Ba/article/details/103704388