从纯粹的外壳角度来看(因为你标记了这个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
输出的行数不止一个。
我分享你对屏保部分的担心; xscreensaver可能未在登录管理器中运行(任何其他形式的X都会涉及登录的用户,其中who
将检测到)。 GDM使用gnome-screensaver,其语法略有不同。 DPMS部分可能已经足够好了,为图形登录提供了比控制台登录两分钟更大的缓冲区。
在函数的最后一行使用return $?
是多余的。我用它来阐明我们实际上使用了前一行的返回值。 nobody_here
short circuits,因此,如果没有用户登录,则无需运行X的地位更昂贵的检查
边注:请小心使用术语"idle",因为它更通常是指资源(即硬件)消耗(例如CPU负载)。有关确定系统(资源)空闲状态的最常用方法,请参阅uptime
命令获取load averages。 (这就是为什么我将函数命名为nobody_here
而不是例如is_idle
)
这可能是http://unix.stackexchange.com/的问题。 – BenC
linux命令“last”为您提供所有用户登录时间的条目列表。所以这部分只是解析文件。 – Peter
@Peter'last'不会让我监视登录和注销,而且'logind'现在已经非常标准了。这是我更关心的其他部分。 – Xenopathic