使用基于 docker 网络流量的 bash 脚本让 Ubuntu 休眠

问题描述 投票:0回答:1

背景

  • 我有一个运行 Ubuntu 的个人家庭服务器。我希望它在服务器活动减慢后进入睡眠状态,以帮助降低功耗。
  • 我编写了一个 shell 脚本来检查 docker 桥网络使用情况。如果它低于某个 MB 阈值,我认为服务器不活动并将其挂起。
  • 我让这个脚本使用 cron 每 2 小时运行一次(现在我让它每 2 分钟运行一次以进行调试)
  • 我在使其正常工作时遇到问题。

我做了什么

  • 首先我通过 ssh 进入我的家庭服务器
  • 然后我编写了bash脚本的代码:
#!/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 日志并查看其运行正常
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
  • 添加了 --force
  • 尝试使用
    $echo <password> | sudo -S systemctl suspend
  • 手动对密码进行硬编码
  • 尝试使用
    sudo pm-suspend

问题:

  • 它不是因为我通过 ssh 执行此操作而暂停吗?
  • 是因为
    systemctl suspend
    需要密码吗?
  • 有没有更简单的方法或其他工具来实现我追求的目标?
linux shell ubuntu cron
1个回答
0
投票

我可能会在代码中添加日志来调试和验证一切。 也许考虑添加:

set -x

您可以试运行挂起并检查是否有东西阻止挂起

sudo /usr/bin/systemctl suspend --dry-run

问题:

  • 它不是因为我通过 ssh 执行此操作而暂停吗?

不太确定,请阅读this在实施之前。 但你可以编辑/etc/systemd/logind.conf

HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
IdleAction=suspend
IdleActionSec=10min
  • 是不是因为systemctl suspend需要密码?

由于您已经将用户drawn配置为不需要密码,所以这不是问题。

  • 有没有更简单的方法或其他工具来实现我追求的目标?

自动挂起(注:它也是开源

如果有任何不清楚、误导或您有其他问题,请告诉我:)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.