Ubuntu 定时清理内存

本文详细介绍了一种在Ubuntu系统上定时清理内存缓存的方法,通过编写并定时执行Shell脚本来监测和控制内存使用,避免内存溢出,提升系统稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题: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 确认是否生效。

参考:

查看内存

参考我之前的博客:

  • 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

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值