我需要检测一台计算机在一段时间内什么时候处于空闲状态。我对懒惰的定义是:
没有用户通过远程方法或本地计算机登录
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_hereshort circuits,因此如果没有用户登录,则无需对x的状态运行更昂贵的检查。
附带说明:使用术语"idle"时要小心,因为它通常指的是资源(硬件,即)消耗(例如cpu负载)。有关确定系统(资源)空闲的最常用方法,请参阅load averagesuptime命令。(这就是为什么我将函数命名为nobody_here而不是例如is_idle

关于c++ - Linux-检测空闲,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21268475/

10-10 23:39