Linux-检测闲置



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

  • 没有用户登录,无论是通过远程方法还是在本地计算机上
  • 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

相关内容

  • 没有找到相关文章