基于Docker网络流量的Ubuntu自动休眠脚本故障排查求助
家庭Ubuntu服务器自动休眠问题
问题背景
我有一台运行Ubuntu的个人家庭服务器,希望在活动放缓后进入休眠以降低功耗。编写了Shell脚本,通过检测Docker网桥(br-开头网卡)的网络使用量,当5秒内总流量低于2MB阈值时,执行系统休眠操作。
脚本内容
#!/bin/bash # Usage threshold in bytes (2MB = 5 * 1024 * 1024) THRESHOLD=$((2 * 1024 * 1024)) INTERVAL=5 calculate_docker_traffic() { RX_BEFORE=0 TX_BEFORE=0 for IFACE in $(ls /sys/class/net | grep '^br-'); do RX_BEFORE=$((RX_BEFORE + $(cat /sys/class/net/$IFACE/statistics/rx_bytes))) TX_BEFORE=$((TX_BEFORE + $(cat /sys/class/net/$IFACE/statistics/tx_bytes))) done echo "$RX_BEFORE $TX_BEFORE" } read RX_BEFORE TX_BEFORE < <(calculate_docker_traffic) sleep $INTERVAL read RX_AFTER TX_AFTER < <(calculate_docker_traffic) RX_DIFF=$((RX_AFTER - RX_BEFORE)) TX_DIFF=$((TX_AFTER - TX_BEFORE)) TOTAL_USAGE=$((RX_DIFF + TX_DIFF)) echo $TOTAL_USAGE if (( TOTAL_USAGE < THRESHOLD )); then echo "Docker network usage is below threshold. Suspending system." sudo /usr/bin/systemctl suspend else echo "Docker network usage is above threshold. Staying awake." fi
定时任务配置
通过sudo crontab -e添加了每2分钟运行一次的定时任务:
*/2 * * * * /bin/bash /home/drew/auto_sleep.sh | logger -t mycmd
当前问题
查看/var/log/syslog日志显示脚本已执行,且检测到流量低于阈值并输出休眠提示,但服务器始终未进入休眠状态。
已尝试的解决方法
- 使用sudo crontab而非普通用户crontab
- 通过visudo配置用户执行systemctl suspend无需密码
- 使用systemctl suspend的完整路径
- 添加
--force参数 - 尝试硬编码密码通过
sudo -S执行 - 改用
pm-suspend命令
疑问
- 是否因SSH连接导致无法休眠?
- 是否仍存在
systemctl suspend的权限问题? - 有无更简便的工具或方法实现服务器自动休眠?
内容的提问来源于stack exchange,提问作者Drew Scatterday
相关产品推荐
相关产品推荐

