我需要检测计算机何时空闲一段时间。我对闲散的定义是:
由于大多数发行版现已转移到logind
,我应该能够使用其DBUS接口来确定用户是否已登录,以及监控登录/注销。我之前使用xautolock
来检测X空闲,我可以继续使用它,但xscreensaver
也可用。但是,由于使用不同组件的不同桌面环境,我希望不再使用任何特定的依赖项,例如屏幕保护程序。
理想情况下,我也可以将闲置放在TTY键盘不活动上,但这不是我最关心的问题。根据{{3}},我应该可以直接查询/dev/input/*
接口,但是我不知道如何解决这个问题。
我之前尝试制作这样的监视器的尝试使用了Bash,因为更改纯文本脚本文件非常方便,如果需要更高级的方法来实现这一点,我很高兴使用C ++。
答案 0 :(得分:0)
从纯粹的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
输出的行数不止一个。
我分享你对屏幕保护程序部分的担心; xscreensaver可能没有在登录管理器中运行(任何其他形式的X都会涉及用户登录,who
会检测到),例如GDM使用gnome-screensaver,其语法略有不同。 DPMS部分可能已经足够好了,为图形登录提供了比控制台登录的两分钟更大的缓冲区。
在函数的最后一行使用return $?
是多余的。我用它来澄清我们实际上是在使用前一行的返回值。 nobody_here
short circuits,因此如果没有用户登录,则无需对X的状态运行更昂贵的检查。
旁注:请注意使用术语"idle",因为它通常指的是资源(硬件,即)消耗(例如CPU负载)。有关确定系统(资源)空闲的最常用方法,请参阅uptime
load averages命令。 (这就是为什么我将我的函数nobody_here
命名为is_idle
)