我发现了几个与此相关的问题,但似乎找不到一个适合我需要的问题。
我希望我的机器 (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
如果两者都超过了设定的时间(在脚本的头部),计算机就会进入睡眠状态。
如何设置
脚本需要
xprintidle
sudo apt-get xprintidle
将脚本复制到一个空文件中,另存为
set_idle.py
- 在脚本的头部部分,设置所需的空闲时间
通过以下命令进行测试:
python3 /path/to/set_idle.py
如果一切正常,请将其添加到启动应用程序。
笔记
此答案假设流量是通过以太网连接进行的。如果不是,则该函数get_packets()
可能需要进行小幅修改。
答案2
我已经设置了自己的 cron 作业来处理这个问题。
我取得的成就
如果机器处于空闲状态(没有击键或移动鼠标)一段时间,则暂停/关闭机器,除非其 SAMBA 服务器中正在访问文件。
要求
root
使用权。xprintidle
(通过在终端中执行来安装sudo apt-get install xprintidle
:)
如何
将以下脚本保存在您选择的位置(就我而言为
/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
找到执行的路径)。xprintidle
which xprintidle
我们还需要指定我们想要获取信息的 DISPLAY
xprintidle
。通常是,但您可以在登录后从终端:0.0
运行并检查列以确保这一点。阅读这三个链接 (w
FROM
1,2和3) 以了解有关PATH
和DISPLAY
的更多信息cron
。确保它可执行:
chmod +x /home/user/.useful-scripts/idle.sh
设置作业定期运行
cron
.smbstatus
需要以 身份运行root
,因此我们需要crontab
使用进行调用sudo
:sudo crontab-e
添加以下行以定期运行脚本:
* * * * * /home/user/.useful-scripts/idle.sh
这将设置一个 cron 作业,每分钟运行一次并执行我们的脚本。如果你不介意较小的精度,你可以将周期设置为更高的值(请参阅此链接以获取有关必要语法的更多信息)。
就是这样。cron
将每分钟检查一次机器的空闲状态,如果空闲时间超过 20 分钟(可以使用变量进行调整IDLE_LIMIT_MS
),它将确保没有文件通过 SAMBA 服务器访问;在这种情况下,它将暂停机器。