2014-01-21 48 views
1

我需要检测计算机何时闲置一段时间。我懒惰的定义是:Linux - 检测闲置

  • 没有登录的用户,或者通过远程方式或本地计算机
  • X服务器活动上,没有鼠标或按键的运动
  • TTY键盘闲置(希望)

由于大部分发行版现在已移至logind,我应该可以使用其DBUS接口来查明用户是否已登录,并且还可以监控登录/注销。我之前使用xautolock来检测X空闲状态,并且我可以继续使用它,但xscreensaver也可用。但是,最好是由于使用不同组件的不同桌面环境,我希望摆脱屏幕保护程序等任何特定的依赖关系。

理想情况下,我也可以基于闲置在TTY键盘不活动,但这不是我最大的担心。据this answer,我应该能够直接查询/dev/input/*接口,但我不知道如何去做这件事。

由于易于更改纯文本脚本文件,我以前使用C++编写这种监视器的尝试都使用Bash,所以如果需要更高级的方法来实现这一点,我是如何使用C++的。

+0

这可能是http://unix.stackexchange.com/的问题。 – BenC

+0

linux命令“last”为您提供所有用户登录时间的条目列表。所以这部分只是解析文件。 – Peter

+0

@Peter'last'不会让我监视登录和注销,而且'logind'现在已经非常标准了。这是我更关心的其他部分。 – Xenopathic

回答

0

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

#!/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_hereshort circuits,因此,如果没有用户登录,则无需运行X的地位更昂贵的检查


边注:请小心使用术语"idle",因为它更通常是指资源(即硬件)消耗(例如CPU负载)。有关确定系统(资源)空闲状态的最常用方法,请参阅uptime命令获取load averages。 (这就是为什么我将函数命名为nobody_here而不是例如is_idle