标题:Ubuntu 定时清理内存
前言
最近跑实验的时候发现内存老爆炸(也就是满了的意思),这给我带来了麻烦,所以在此记录:Ubuntu 定时清理内存的过程。
1 [更新] 新方案
更新时间:2020年4月15日23:34:11
步骤和下面小结一样。
但是脚本变得更加"聪明"、“灵敏”了:
即将Sync
重写如下:
#!/bin/bash
mem=`free -m | grep Mem | awk '{print $3}'`
echo "before clearing cache, the used memory is: $mem"
echo "current time: $(date)"
#只有当被使用的内存量超过8000M(即8G)的时候,才清除缓存。
if [ $mem -gt 8000 ]; then
echo "current used mem: $mem is greater than 15000, thus clear now"
sync;sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
else
echo "current used mem: $mem is no greater than 15000, thus not clear now"
fi
mem=`free -m | grep Mem | awk '{print $3}'`
echo "after clearing cache, the memory is: $mem"
echo ""
echo ""
参考:
2 [补充] 新方案
更新时间:2020年4月15日10:51:24
1)创建Sync
脚本:
#!/bin/bash
# 输出清空缓存前的内存使用量
read mem< <(awk '/MemTotal/{total=$2}/MemFree/{free=$2}/Buffers/{buffers=$2}/^Cached/{cached=$2}END{print (total-free-buffers-cached)/1024}' /proc/meminfo)
echo "before clearing cache, the memory is: $mem"
# 清空缓存
echo "current time: $(date)"
sync;sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
# 输出清空缓存后的内存使用量
read mem< <(awk '/MemTotal/{total=$2}/MemFree/{free=$2}/Buffers/{buffers=$2}/^Cached/{cached=$2}END{print (total-free-buffers-cached)/1024}' /proc/meminfo)
echo "after clearing cache, the memory is: $mem"
2)sudo crontab -e
然后在末尾添加:
0 */12 * * * /home/apr/Sync >> /home/apr/synclog 2>&1
每12小时运行一次。
备注:
每30min-> */30 * * * *
3)sudo crontab -l
确认是否生效。
参考:
- Syntax error: redirection unexpected [duplicate] (指出要确保:
#!/bin/bash
) - Ubuntu 14.04 not running Bash scripts in /etc/cron.daily [duplicate] (指出要使用
sudo crontab -e
) - How to set up a root cron job properly (指出要把root删了,即:
0 */12 * * * /home/apr/Sync >> /home/apr/synclog 2>&1
不需要root
参数) - cronjob says “/bin/sh: 1: root: not found”
- Cron job not running - postfix/sendmail error (末尾加上
2>&1
帮助我找到了原因,/bin/sh: 1: root: not found
)
查看内存
参考我之前的博客:
- ubuntu进程监视器htop 介绍 + 如何清除内存(缓存) https://blog.csdn.net/weixin_39278265/article/details/87917514
输入:htop
实验中我发现这个绿色的内存常常只占一半(16G),但是剩下的16G全部被蓝色和黄色的内存占满了(这些内存都是缓存)。
所以我希望能够定时清理一波这些缓存(也就是把缓存写入到文件,然后清除缓存)
操作如下。
方案
1)运行 nano Sync.sh 添加如下内容
echo "start syncmem `date '+%Y-%m-%d %H:%M:%S'`"
sync;sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
2)chmod +x Sync.sh
3)然后:sudo nano /etc/crontab,在末尾添加:
0 */1 * * * root /bin/bash /home/dale/Sync.sh >> /home/dale/syncmem.log
即可。这样设置的话,就是用root权限,每隔一小时运行 /bin/bash /home/dale/Sync.sh >> /home/dale/syncmem.log
这样的指令。
参考文献
主要:
- shell学习笔记之crontab https://www.cnblogs.com/yblecs/p/10229016.html
- Linux shell脚本有一条sudo语句,如何在脚本里获得本人的密码,从而得到root权限? https://zhidao.baidu.com/question/1754608882617028908.html
- linux 下设置定时任务执行shell脚本 https://zhaolicric.iteye.com/blog/1533498
- shell | crontab 定时任务 https://cloud.tencent.com/developer/article/1392291
前期误导了我一下:
- Linux 执行定时任务 shell脚本 https://www.cnblogs.com/zhangchao0515/p/9772706.html
- linux设置定时任务的方法步骤 https://www.jb51.net/article/139368.htm
- shell脚本的定时任务 https://www.jianshu.com/p/69b70f44b372
其他:
- How to Clear RAM Memory Cache, Buffer and Swap Space on Linux https://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/
(解释命令sync;sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
) - Setting /proc/sys/vm/drop_caches to clear cache https://unix.stackexchange.com/questions/17936/setting-proc-sys-vm-drop-caches-to-clear-cache
补充:
- How to run cron job every 2 hours https://stackoverflow.com/questions/6423532/how-to-run-cron-job-every-2-hours
(这个纠正了我的定时设置。 原来是:* */1 * * * root /bin/bash /home/dale/Sync.sh >> /home/dale/syncmem.log
,但是这样就是每一分钟执行一次,而不是每个小时。所以应该改成:0 */1 * * * root /bin/bash /home/dale/Sync.sh >> /home/dale/syncmem.log
)