Unix Mint下如何用Bash脚本实现CPU idle超时自动挂起?
纯Bash实现CPU idle检测后自动挂起方案
一、核心Bash脚本实现
创建一个可执行脚本(比如~/cpu_idle_check.sh),实现指定时间间隔的CPU负载检查与挂起逻辑:
#!/bin/bash # 配置参数 THRESHOLD=10 # CPU使用率阈值(%) CHECK_INTERVAL=5 # 检查的时间间隔(分钟) LOG_FILE=~/cpu_suspend_log.txt # 获取当前CPU使用率(100减去空闲率,取整数部分) current_cpu=$(mpstat 1 1 | awk '/Average:/ {print 100 - $12}') current_cpu=${current_cpu%.*} # 获取${CHECK_INTERVAL}分钟前的CPU使用率(依赖sysstat的sar工具) past_cpu=$(sar -u -s $(date -d "${CHECK_INTERVAL} minutes ago" +%H:%M:00) | awk '/Average:/ {print 100 - $NF}') # 处理首次运行无历史数据的情况 if [ -z "$past_cpu" ]; then echo "$(date): 无历史CPU数据,跳过本次检查" >> "$LOG_FILE" exit 0 fi past_cpu=${past_cpu%.*} # 判断是否满足挂起条件 if (( current_cpu < THRESHOLD && past_cpu < THRESHOLD )); then echo "$(date): CPU已连续${CHECK_INTERVAL}分钟低负载(当前${current_cpu}%,${CHECK_INTERVAL}分钟前${past_cpu}%),执行挂起" >> "$LOG_FILE" systemctl suspend else echo "$(date): 当前CPU使用率${current_cpu}%,${CHECK_INTERVAL}分钟前${past_cpu}%,未达挂起条件" >> "$LOG_FILE" fi
脚本说明
- 用
mpstat采样1秒的当前CPU平均使用率,通过awk计算实际负载(100减去空闲率) - 用
sar读取历史CPU数据,指定检查间隔前的时间点获取负载值 - 对数值取整避免Bash小数比较的问题
- 记录日志方便后续排查
二、依赖安装与配置
如果系统缺少mpstat和sar工具,安装sysstat包:
sudo apt install sysstat
若sysstat未启用数据收集,编辑配置文件开启:
sudo nano /etc/default/sysstat
将ENABLED="false"改为ENABLED="true",然后重启服务:
sudo systemctl restart sysstat
三、配置普通用户无密码挂起权限
普通用户默认执行systemctl suspend需要密码,通过polkit配置无权限验证:
- 创建规则文件:
sudo nano /etc/polkit-1/rules.d/90-suspend.rules
- 写入以下内容:
polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.login1.suspend" && subject.isInGroup("users")) { return polkit.Result.YES; } });
- 保存退出即可,规则立即生效
四、配置crontab定时运行
以普通用户身份编辑crontab:
crontab -e
添加定时任务(每5分钟运行一次,可修改*/5调整间隔):
*/5 * * * * /home/你的用户名/cpu_idle_check.sh
替换你的用户名为实际系统用户名,确保脚本路径正确。
五、测试脚本
手动运行脚本验证逻辑:
chmod +x ~/cpu_idle_check.sh ./cpu_idle_check.sh
若CPU负载符合条件,系统会立即挂起;否则会输出状态到日志文件。
内容的提问来源于stack exchange,提问作者7824238
相关产品推荐
相关产品推荐

