我取得的成就

我取得的成就

我发现了几个与此相关的问题,但似乎找不到一个适合我需要的问题。

我希望我的机器 (Xubuntu 16.04) 在 30 分钟内不使用时关闭。但是,我使用它来将视频流式传输到我的媒体中心(通过 SAMBA 服务器),因此我不希望它在这种情况下关闭。

我发现的所有答案都忽略了网络活动,只关注击键和鼠标移动。

答案1

您可以运行(电量非常低的)后台脚本,它将暂停计算机,四舍五入为 10 秒:

#!/usr/bin/env python3
import time
import subprocess

# --- set idle time below (seconds)
idle_set = 1200
# ---

def get_packets():
    return int([l.strip().split()[1].replace("packets:", "") for l in \
            subprocess.check_output("ifconfig").decode("utf-8").splitlines()\
            if " RX " in l][0])

def get_idle():
    return int(int(subprocess.check_output("xprintidle").decode("utf-8").strip())/1000)

data1 = get_packets()
t = 0

while True:
    time.sleep(10)
    data2 = get_packets()
    if data2 - data1 > 3000:
        t = 0
    else:
        t += 10
    idletime = get_idle()
    if all([idletime > idle_set, t > idle_set]):
        subprocess.Popen(["systemctl", "suspend", "-i"])
    data1 = data2

它能做什么

  • 每 10 秒检查一次当前已收到数据量,将其与 10 秒前的数据进行比较(使用ifconfig)。如果超过一定量,则将“计数器”设置为零,否则将 a0 秒添加到“流”空闲时间。
  • 此外,它每 10 秒还会查看一次“一般”空闲时间,使用xprintidle

如果两者都超过了设定的时间(在脚本的头部),计算机就会进入睡眠状态。

如何设置

  1. 脚本需要xprintidle

    sudo apt-get xprintidle
    
  2. 将脚本复制到一个空文件中,另存为set_idle.py

  3. 在脚本的头部部分,设置所需的空闲时间
  4. 通过以下命令进行测试:

    python3 /path/to/set_idle.py
    

如果一切正常,请将其添加到启动应用程序。

笔记

此答案假设流量是通过以太网连接进行的。如果不是,则该函数get_packets()可能需要进行小幅修改。

答案2

我已经设置了自己的 cron 作业来处理这个问题。

我取得的成就

如果机器处于空闲状态(没有击键或移动鼠标)一段时间,则暂停/关闭机器,除非其 SAMBA 服务器中正在访问文件。

要求

  • root使用权。
  • xprintidle(通过在终端中执行来安装sudo apt-get install xprintidle:)

如何

  1. 将以下脚本保存在您选择的位置(就我而言为/home/user/.useful-scripts/idle.sh):

    #!/bin/bash
    
    # Checks the time the computer has been idle (no keystrokes or mouse moves)
    # If it's greater than the set limit, it will suspend the machine if no
    # files are being accessed through the SAMBA server.
    
    
    # The maximum number of milliseconds the computer is allowed to be idle before
    # it is suspended (set to 20 minutes)
    IDLE_LIMIT_MS=1200000
    
    # How long the machine has been idle for
    IDLE_TIME_MS=$(/sbin/runuser -l ic -c "DISPLAY=:0.0 /usr/bin/xprintidle")
    
    if [ $IDLE_TIME_MS -gt $IDLE_LIMIT_MS ] ;
    then
        # If there are no files locked by SAMBA, suspend the machine
        FILES_LOCKED=$(/usr/bin/smbstatus | /bin/grep 'Locked files:')
    
        if [[ -z "${FILES_LOCKED}" ]] ;
        then
            /bin/systemctl suspend -i
            # If you prefer to shut down instead of suspend, comment the
            # previous line and uncomment the following one:
            # /sbin/poweroff
        fi
    fi
    

    请注意,此脚本将由 运行cron。这有一定的含义,但主要是因为DISPLAY和环境变量未设置。因此,我们需要在调用命令时提供完整路径。路径可能会在您的机器上发生变化,因此请确保它们与您的配置相匹配(例如,在终端中PATH找到执行的路径)。xprintidlewhich xprintidle

    我们还需要指定我们想要获取信息的 DISPLAY xprintidle。通常是,但您可以在登录后从终端:0.0运行并检查列以确保这一点。阅读这三个链接 (wFROM123) 以了解有关PATHDISPLAY的更多信息cron

  2. 确保它可执行:

    chmod +x /home/user/.useful-scripts/idle.sh

  3. 设置作业定期运行cron.smbstatus需要以 身份运行root,因此我们需要crontab使用进行调用sudo

    sudo crontab-e

    添加以下行以定期运行脚本:

    * * * * * /home/user/.useful-scripts/idle.sh

    这将设置一个 cron 作业,每分钟运行一次并执行我们的脚本。如果你不介意较小的精度,你可以将周期设置为更高的值(请参阅此链接以获取有关必要语法的更多信息)。

就是这样。cron将每分钟检查一次机器的空闲状态,如果空闲时间超过 20 分钟(可以使用变量进行调整IDLE_LIMIT_MS),它将确保没有文件通过 SAMBA 服务器访问;在这种情况下,它将暂停机器。

相关内容