Я хочу проверить внутри bash-скрипта, как долго пользователь X-сессии простаивает.
Сам пользователь не должен использовать bash, а просто X. Если пользователь, например, просто переместил мышь, хорошим ответом будет «простоя в течение 0 секунд». Если он не дотронулся до компьютера в течение 5 минут, хорошим ответом было бы «бездействовать в течение 300 секунд»
. Причина, по которой вы не можете сразу использовать xautolock, состоит в том, чтобы иметь возможность реализовать некоторые сложные действия. Например, если пользователь простаивает в течение 10 минут, попробуйте приостановить, если он простаивает более 5 минут, отключение (я знаю, это звучит странно, но приостановка не всегда работает здесь ...)
Просто нашел простой способ сделать это.
Существует программа под названием xprintidle, которая делает трюк
, чтобы получить время простоя (в миллисекундах) так же просто, как
xprintidle
и установить
apt-get install xprintidle
< hr> Для системных администраторов он также работает удаленно
Из сеанса ssh :
export DISPLAY=:0 && sudo -u john xprintidle
, где john - зарегистрированный пользователь в сеанс X на удаленном компьютере.
Ответ от здесь :
В bash
w | tr -s " " | cut -d" " -f1,5 | tail -n+3
выдает пару имя пользователя / простой для каждой оболочки. Таким образом, в основном вы можете получить информацию о простое с помощью команды w
Использование ответа josinalvo может сработать для некоторых, но не совсем так хорошо для Мне кажется, что некоторые программы неожиданно регулярно сбрасывают таймер, на который полагается xprintidle
. Кроме того, я также не хотел бы, чтобы полноэкранное приложение сбрасывало таймер простоя, по крайней мере, не в моем случае использования.
Поэтому я собрал собственное решение в сценарии оболочки, который не зависит от расширения X11 Screen Saver. Вместо этого он выводит весь пользовательский ввод, такой как движения мыши и нажатия клавиш, используя 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
Не стесняйтесь оставлять любые предложения.