#!/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
将其添加为 cronjob。为了调试,我让它每 2 分钟运行一次。我还在最后添加了记录器部分,这样我就可以看到它的日志:*/2 * * * * /bin/bash /home/drew/auto_sleep.sh | logger -t mycmd
grep 'mycmd' /var/log/syslog
sudo crontab -e
而不是 crontab -e
sudo visudo
然后 drew ALL=(ALL) NOPASSWD: /usr/bin/systemctl suspend
/usr/bin/systemctl suspend
/usr/bin/systemctl suspend --force
$echo <password> | sudo -S systemctl suspend
sudo pm-suspend
systemctl suspend
需要密码吗?我可能会在代码中添加日志来调试和验证一切。 也许考虑添加:
set -x
您可以试运行挂起并检查是否有东西阻止挂起
sudo /usr/bin/systemctl suspend --dry-run
问题:
不太确定,请阅读this在实施之前。 但你可以编辑/etc/systemd/logind.conf
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
IdleAction=suspend
IdleActionSec=10min
由于您已经将用户drawn配置为不需要密码,所以这不是问题。
如果有任何不清楚、误导或您有其他问题,请告诉我:)