Linux - 检测闲置

时间:2014-01-21 20:31:09

标签: c++ linux bash input

我需要检测计算机何时空闲一段时间。我对闲散的定义是:

  • 没有用户通过远程方法或本地计算机登录
  • X服务器不活动,没有移动鼠标或按键
  • TTY键盘不活动(希望如此)

由于大多数发行版现已转移到logind,我应该能够使用其DBUS接口来确定用户是否已登录,以及监控登录/注销。我之前使用xautolock来检测X空闲,我可以继续使用它,但xscreensaver也可用。但是,由于使用不同组件的不同桌面环境,我希望不再使用任何特定的依赖项,例如屏幕保护程序。

理想情况下,我也可以将闲置放在TTY键盘不活动上,但这不是我最关心的问题。根据{{​​3}},我应该可以直接查询/dev/input/*接口,但是我不知道如何解决这个问题。

我之前尝试制作这样的监视器的尝试使用了Bash,因为更改纯文本脚本文件非常方便,如果需要更高级的方法来实现这一点,我很高兴使用C ++。

1 个答案:

答案 0 :(得分:0)

从纯粹的shell角度来看(因为你标记了这个),你可以非常接近你想要的东西。

#!/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