目录

安装 pm-utils

pm-utils 是一个用于电源管理的工具包,主要用于 Linux 系统上实现休眠(hibernation)和挂起(suspend)功能。在 Ubuntu 等基于 Debian 的发行版中,pm-utils 提供了一套脚本和实用程序,可以方便地管理系统的电源状态。

sudo atp install pm-utils 

pm-utils 的常用命令

  • pm-suspend:将系统挂起到内存。
  • pm-hibernate:将系统休眠到磁盘。
  • pm-suspend-hybrid:执行混合休眠。
  • pm-is-supported:检查系统是否支持挂起或休眠。

安装vnstat

vnstat 是一个网络流量监控工具,可以记录和查看网络接口的流量统计信息

sudo apt install vnstat

使用 vnstat 查看实时流量:

  • vnstat -l
  • sudo vnstat -u -i enp3s0

无流量自动睡眠

sudo vi /etc/pm/sleep.d/99_check_network_traffic.sh
#!/bin/bash
 
# 设置调试日志文件路径
DEBUG_LOG="/var/log/pm_suspend_debug.log"
# 设置网络流量文件路径
NETWORK_TRAFFIC_FILE="/tmp/network_traffic"
PREV_NETWORK_TRAFFIC_FILE="/tmp/prev_network_traffic"
 
# 记录脚本执行的时间到调试日志
echo "Script executed at: $(date)" >> $DEBUG_LOG
 
# 检查是否有活跃的 SSH 会话
ACTIVE_SSH_SESSIONS=$(ss -tnp | grep 'sshd' | grep 'ESTAB' | wc -l)
 
# 如果有活跃的 SSH 会话,记录到调试日志并退出脚本
if [[ $ACTIVE_SSH_SESSIONS -gt 0 ]]; then
    echo "Active SSH sessions detected. System will not suspend." >> $DEBUG_LOG
    exit 0
fi
 
# 获取当前网络流量统计
CURRENT_RX=$(vnstat --oneline | awk -F';' '{print $11}' | awk '{print $1}')
CURRENT_TX=$(vnstat --oneline | awk -F';' '{print $13}' | awk '{print $1}')
 
# 记录当前网络流量到调试日志
echo "CURRENT_RX: $CURRENT_RX" >> $DEBUG_LOG
echo "CURRENT_TX: $CURRENT_TX" >> $DEBUG_LOG
 
# 检查之前的网络流量统计
if [[ -f $PREV_NETWORK_TRAFFIC_FILE ]]; then
    # 读取之前保存的网络流量数据
    read PREV_RX PREV_TX < $PREV_NETWORK_TRAFFIC_FILE
 
    # 记录之前的网络流量到调试日志
    echo "PREV_RX: $PREV_RX" >> $DEBUG_LOG
    echo "PREV_TX: $PREV_TX" >> $DEBUG_LOG
    
    # 计算接收和发送流量的差值
    RX_DIFF=$(echo "$CURRENT_RX - $PREV_RX" | bc)
    TX_DIFF=$(echo "$CURRENT_TX - $PREV_TX" | bc)
    
    # 记录差值到调试日志
    echo "RX difference: $RX_DIFF" >> $DEBUG_LOG
    echo "TX difference: $TX_DIFF" >> $DEBUG_LOG
    
    # 如果接收和发送流量差值都为零,则挂起系统
    if [[ $RX_DIFF == 0 && $TX_DIFF == 0 ]]; then
        echo "No network traffic. Suspending system." >> $DEBUG_LOG
        sudo systemctl suspend
    else
        echo "Network traffic detected. System will not suspend." >> $DEBUG_LOG
    fi
else
    echo "Previous network traffic data not found." >> $DEBUG_LOG
fi
 
# 保存当前网络流量统计到临时文件
echo "$CURRENT_RX $CURRENT_TX" > $NETWORK_TRAFFIC_FILE
echo "Current network traffic written to $NETWORK_TRAFFIC_FILE" >> $DEBUG_LOG
 
# 如果之前的网络流量文件存在,删除它
if [[ -f $PREV_NETWORK_TRAFFIC_FILE ]]; then
    rm $PREV_NETWORK_TRAFFIC_FILE
    echo "Previous network traffic file $PREV_NETWORK_TRAFFIC_FILE deleted" >> $DEBUG_LOG
fi
 
# 将当前网络流量文件重命名为之前的网络流量文件
mv $NETWORK_TRAFFIC_FILE $PREV_NETWORK_TRAFFIC_FILE
echo "Current network traffic file renamed to $PREV_NETWORK_TRAFFIC_FILE" >> $DEBUG_LOG
sudo chmod+x /etc/pm/sleep.d/99_check_network_traffic.sh

新建 crontab 任务

sudo crontab -e
 
#5 分钟执行一次
*/5 * * * * /etc/pm/sleep.d/99_check_network_traffic.sh