我需要检测一台计算机在一段时间内什么时候处于空闲状态。我对懒惰的定义是:
没有用户通过远程方法或本地计算机登录
x服务器不活动,不移动鼠标或按键
TTY键盘不活动(希望如此)
由于大多数发行版现在已经转移到logind
,我应该能够使用它的dbus接口来查明用户是否已登录,并监视登录/注销。我以前使用过xautolock
来检测x空闲,我可以继续使用它,但是xscreensaver
也是可用的。不过,由于不同的桌面环境使用不同的组件,我最好不要使用任何特定的依赖项,比如屏幕保护程序。
理想情况下,我也可以将空闲建立在TTY键盘不活动的基础上,不过这并不是我最担心的。根据this answer,我应该可以直接查询/dev/input/*
接口,但是我不知道如何去做。
我以前做这种监视器的尝试使用了BASH,这是因为改变了纯文本脚本文件的方便性,但我很高兴使用C++来实现更高级的方法。
最佳答案
从纯shell的角度来看(因为您标记了这个bash),您可以真正接近您想要的。
#!/bin/sh
users_are_logged_in() {
who |grep -q .
return $?
}
x_is_blanked() {
local DISPLAY=:0
if xscreensaver-command -time |grep -q 'screen blanked'; then
return 0 # we found a blanked xscreensaver: return true
fi
# no blanked xscreensaver. Look for DPMS modes
xset -q |awk '
/DPMS is Enabled/ { dpms = 1 } # DPMS is enabled
/Monitor is On$/ { monitor = 1 } # The monitor is on
END { if(dpms && !monitor) { exit 0 } else { exit 1 } }'
return $? # true when DPMS is enabled and the monitor is not on
}
nobody_here() {
! users_are_logged_in && x_is_blanked
return $?
}
if nobody_here; then
sleep 2m
if nobody_here; then
# ...
fi
fi
这假设用户可以在两分钟内登录,否则就没有tty键盘活动。
您应该验证
who |grep
在您的系统上是否有效(即没有标题)。我本来是为/
而准备的,但那对freebsd是行不通的。如果who
有标题,可以尝试[ $(who |grep -c .) -gt 1 ]
这将告诉您who
输出的行数不止一行。我和你一样担心屏幕保护程序部分;x screensaver可能没有在登录管理器中运行(任何其他形式的x都会涉及到登录的用户,而
who
会检测到),例如gdm使用gnome屏幕保护程序,其语法会略有不同。dpms部分可能已经足够好了,它为图形登录提供了比控制台登录两分钟大得多的缓冲区。在函数的最后一行使用
return $?
是多余的。我用它来说明我们实际上是在使用前一行的返回值。nobody_here
short circuits,因此如果没有用户登录,则无需对x的状态运行更昂贵的检查。附带说明:使用术语"idle"时要小心,因为它通常指的是资源(硬件,即)消耗(例如cpu负载)。有关确定系统(资源)空闲的最常用方法,请参阅load averages的
uptime
命令。(这就是为什么我将函数命名为nobody_here
而不是例如is_idle
)关于c++ - Linux-检测空闲,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21268475/