我需要检测到一定时间段的计算机何时闲置。我对闲置的定义是:
- 没有用户登录,无论是通过远程方法还是在本地计算机上
- x服务器不活动,没有鼠标或钥匙的移动
- TTY键盘不活动(希望)
由于大多数发行版现在已移至logind
,因此我应该能够使用其DBUS界面来找出用户是否已登录,并监视登录/登录名。我以前曾使用xautolock
检测X空闲度,并且可以继续使用它,但是xscreensaver
也可用。但是,最好是我想远离任何特定的依赖项,例如使用不同组件的不同桌面环境,例如屏幕保护程序。
理想情况下,我也能够基于TTY键盘的无效,但这并不是我最大的担忧。根据这个答案,我应该能够直接查询/dev/input/*
接口,但是我不知道该如何解决。
我以前制作此类监视器的尝试使用了Bash,由于易于更改纯文本脚本文件,Howver我很高兴使用C ,以防万一需要更多高级方法来实现此目的。
从纯粹的外壳的角度(由于您标记为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
在系统上工作(即无标题)。我最初是为 /
grepp的,但是它在freebsd上不起作用。如果who
有标题,也许尝试[ $(who |grep -c .) -gt 1 ]
,它会告诉您who
输出的行数不止一个。
我分享您对屏幕保护程序部分的担心;Xscreensaver可能没有在登录管理器中运行(X的任何其他形式都将涉及登录的用户,who
将检测到它),例如,GDM使用Gnome-Screensaver,其语法将略有不同。DPM的部分可能足够好,给图形登录的缓冲区比控制台登录的两分钟要大得多。
在函数的最后一行中使用return $?
是冗余。我用它来阐明我们实际上使用了上一行的返回值。nobody_here
短路,因此,如果没有登录用户,则无需对X的状态进行更昂贵的检查。
附带注意:使用"空闲"一词时要小心,因为它通常是指资源(硬件,即)消耗(例如CPU负载)。有关加载平均值的uptime
命令,以确定系统(资源)空闲的最常见方法。(这就是为什么我命名我的函数nobody_here
而不是is_idle
)