我想在 bash 脚本中检查 X 会话的用户空闲了多长时间。
用户本人不必使用 bash,只需使用 X。例如,如果用户只是移动了鼠标,那么好的答案就是“空闲 0 秒”。如果他 5 分钟内没有碰过电脑,那么好的答案就是“空闲 300 秒”
不立即使用 xautolock 的原因是为了能够实现一些复杂的行为。例如,如果用户闲置了 10 分钟,则尝试暂停,如果用户闲置超过 5 分钟,则关闭(我知道这听起来很奇怪,但暂停在这里并不总是有效...)
答案1
刚刚找到了一个简单的方法。
有一个名为 xprintidle 的程序可以解决这个问题
获取空闲时间(以毫秒为单位)非常简单
xprintidle
并安装
apt-get install xprintidle
对于系统管理员来说,它也可以远程工作
从ssh 会话:
export DISPLAY=:0 && sudo -u john xprintidle
其中 john 是登录到远程机器上的 X 会话的用户。
请注意,某些程序(例如 MPlayer)似乎会重置计数器。
这可能是可取的,也可能不是,这取决于您的应用程序。对我来说,我打算用它来暂停计算机,而 MPlayer 异常很有帮助。
还有另一个答案(https://askubuntu.com/a/1303464/56440)对于那些不想重置的人来说,但我还没有亲自测试过
答案2
使用 josinalvo 的答案可能对某些人有用,但对我来说效果不太好,因为有些程序似乎定期重置计时器,xprintidle
出乎意料地依赖于此。此外,我也不希望全屏应用程序重置空闲计时器,至少在我的用例中不会。
因此,我将自己的解决方案组合在一个 shell 脚本中,该脚本不依赖于 X11 屏幕保护程序扩展。相反,它会转储xinput test-xi2 --root
一秒钟内的所有用户输入,如鼠标移动和按键,然后将其与上一秒的转储进行比较。如果它们相同,则变量$t
增加 1,否则重置。这是循环的,当变量$t
超过阈值时$idletime
,会打印用户处于空闲状态。
idleloop() {
touch /tmp/.{,last_}input
cmd='stat --printf="%s"'
idletime=120
a=2
t=0
while true
do
timeout 1 xinput test-xi2 --root > /tmp/.input
if [[ `eval $cmd /tmp/.input` == `eval $cmd /tmp/.last_input` ]]
then
let t++ # increases $t by 1
else
t=0 # resets $t
fi
mv /tmp/.{,last_}input -f
if [ $t -ge $idletime ] && [[ $a == "2" ]]
then
echo "user has gone idle"
a=1
fi
if [ $t -lt $idletime ] && [[ $a == "1" ]]
then
echo "user has come back from idle"
a=2
fi
done
}
idleloop
请随时留下任何建议。
答案3
来自的回答这里:
在 bash 中
w | tr -s " " | cut -d" " -f1,5 | tail -n+3
为每个 shell 提供用户名/空闲时间对。因此,基本上你可以通过命令获取空闲信息w
答案4
这是一个完整的 bash 脚本,它检测用户/系统是否空闲 5 秒或更长时间,并将数据写入文件。借助另一个 bash 或 Python 脚本,我们可以对该文本文件进行更多分析。显然,我们可以根据需要更改这些值(idletime_threshold)。
/bin/bash #!/bin/bash # 使用 dbus.sh 检测用户空闲繁忙时间 idletime_threshold=5000 # 以毫秒为单位 #idletime_threshold=300000 # 以毫秒为单位 a=2 输出=系统空闲繁忙.txt 空闲循环(){ 虽然正确 做 睡眠 1 # 秒 现在=`日期“+%Y-%m-%d%H:%M:%S”` get_idle_time=`dbus-send --print-reply --dest=org.gnome.Mutter.IdleMonitor /org/gnome/Mutter/IdleMonitor/Core org.gnome.Mutter.IdleMonitor.GetIdletime` idle_time=$(echo $get_idle_time | awk'{print $NF}') #echo "${idle_time}" # 毫秒 如果 [ $idle_time -ge $idletime_threshold ] && [[ $a == "2" ]] 然后 回显“空闲:${now}”| tee -a $输出 a=1 菲 如果 [ $idle_time -lt $idletime_threshold ] && [[ $a == "1" ]] 然后 回显“忙:${now}”| tee -a $output a=2 菲 完毕 } 空闲循环
输出:
u-20:〜/下载$ tailc -f system-idle-busy.txt 空闲 : 2022-09-15 14:20:00 忙碌 : 2022-09-15 14:20:02 空闲 : 2022-09-15 14:20:25 忙碌 : 2022-09-15 14:20:59 空闲 : 2022-09-15 14:23:48