отслеживание действий пользователя в bash (как узнать, были ли нажаты клавиши?)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

отслеживание действий пользователя в bash

Сообщение drBatty »

Хотелось бы что-бы скрипт на bash(очень медленный), работал только тогда, когда меня нет за компом. Например если я не нажимал 40 минут на кнопки. Как бы это проще и переносимо отследить? Например screensaver это как-то отслеживает... Можно ли на bash?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Mage-Warrior
Сообщения: 869
Статус: Семь раз понюхай, один раз откуси!
ОС: SlackWare 12.1

Re: отслеживание действий пользователя в bash

Сообщение Mage-Warrior »

drBatty писал(а):
06.05.2009 20:23
Хотелось бы что-бы скрипт на bash(очень медленный), работал только тогда, когда меня нет за компом. Например если я не нажимал 40 минут на кнопки. Как бы это проще и переносимо отследить? Например screensaver это как-то отслеживает... Можно ли на bash?

Появилась одна идея... воспользоваться event-файлами. У меня они в /dev/input/. Какое устройство, на каком event-е, можно узнать в /proc/bus/input/devices. В строке типа такой
Handlers=kbd event0

... Вы и найдете номер event-файла-устройства. Есть одно НО - файлы доступны для чтения только root-у (что, несомненно, логично). Дальше я подсказать не могу, так как сам не знаю, но предполагаю, что уже есть демон, который оповещает о получении событий.
*- Большинство проблем, дружок, завсегда покажет лог! -*
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: отслеживание действий пользователя в bash

Сообщение drBatty »

Mage-Warrior писал(а):
06.05.2009 21:04
Появилась одна идея... воспользоваться event-файлами.
не совсем понял как его прочитать... команда cat что-то не читает если так

Код: Выделить всё

#!/bin/sh

while true
do
    date >> event_log.txt
    cat /dev/input/event0 >> event_log.bin
    sleep 1
done

UPD:
не, читает... только непонятно как-то... дату всего 2 раза скрипт вывел...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Mage-Warrior
Сообщения: 869
Статус: Семь раз понюхай, один раз откуси!
ОС: SlackWare 12.1

Re: отслеживание действий пользователя в bash

Сообщение Mage-Warrior »

Это третья причина, по которой нужен демон.
Первая, права!
Вторая, вывод действий пользователя в файл, который опять же для пользователя должен (обязан) быть недоступен.
Третья, команда cat прерывает свое выполнение либо, когда приходит сигнал о завершении ее работы, либо при встрече с EOF. Поэтому в файл сыплются все действия, но... команда реагирует не на каждый первый упавший байт.
По третьей причине могу порекомендовать использовать команду dd по типу:

Код: Выделить всё

dd if=/dev/input/event0 of=/dev/null bs=1 count=1

В таком случае чтение будет происходить в null (это лучше, чем в файл) и будет завершаться при прочтении одного байта из event0. Кстати, а что у Вас event0?

P.S. Хотелось бы все-таки найти демон, который просто сообщает о событиях (не об их содержании). Чувствую своей здоровой (от слова "здоровье" :) ) печенью, что должен быть такой. Помогайте, форумчане!
*- Большинство проблем, дружок, завсегда покажет лог! -*
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: отслеживание действий пользователя в bash

Сообщение sash-kan »

$ xdg-screensaver status
выдаёт статус — запущен ли в данный момент скринсейвер.
если не сработало (у меня — нет), смотрим http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=511248 и видим магическую команду:

Код: Выделить всё

xset q | sed '/^Screen Saver:/,/^[^ ]/ { s/.*timeout: *\([0-9]*\).*/\1/; t }; d'

тест

$ while true; do xset q | sed '/^Screen Saver:/,/^[^ ]/ { s/.*timeout: *\([0-9]*\).*/\1/; t }; d'; sleep 5; done 600 600 0 0 0 0 600 ^C $
нули выдало во время работы скринсейвера.
если результат больше нуля, скринсейвер не работает.

p.s. а ещё есть nice.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: отслеживание действий пользователя в bash

Сообщение drBatty »

sash-kan писал(а):
07.05.2009 19:33
xdg-screensaver status

выдаёт всегда enabled
xset q всегда 0
sash-kan писал(а):
07.05.2009 19:33
p.s. а ещё есть nice.
ага. а есть ещё "трудноуловимый баг в ядре", из-за которого всё тормозит, хотя загрузка 5%
ну а так-как 5%, то nice я как-то не ощущаю...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
svary
Сообщения: 49
ОС: Linux FC-9

Re: отслеживание действий пользователя в bash

Сообщение svary »

Может быть просто анализировать загрузку процессора ? например, вот так :

Код: Выделить всё

#include <sys/sysinfo.h>
int sysinfo(struct sysinfo *info);

             struct sysinfo {
                   long uptime;             /* секунд с момента начальной загрузки */
                   [b]unsigned long loads[3];  /* средняя загрузка системы за 1, 5 и 15 минут */[/b]
                   unsigned long totalram;  /* общее количество оперативной памяти */
                   unsigned long freeram;   /* объём доступной памяти */
                   unsigned long sharedram; /* объём разделяемой памяти */
                   unsigned long bufferram; /* память, используемая под буферы */
                   unsigned long totalswap; /* общий объём своппинга */
                   unsigned long freeswap;  /* доступно памяти на своппинге */
                   unsigned short procs;    /* количество текущих процессов */
                   unsigned long totalhigh; /* общий объём старшей (high) памяти */
                   unsigned long freehigh;  /* доступный объём старшей (high) памяти */
                   unsigned int mem_unit;   /* Размер модуля памяти в байтах */
                   char _f[20-2*sizeof(long)-sizeof(int)]; /* остаток для libc5 */
              };


Скажем, раз в 10 минут вызываем эту ф-цию, и если загрузка за последние 15 минут ниже порога - запускаем Ваш процесс...
Спасибо сказали:
Аватара пользователя
Mage-Warrior
Сообщения: 869
Статус: Семь раз понюхай, один раз откуси!
ОС: SlackWare 12.1

Re: отслеживание действий пользователя в bash

Сообщение Mage-Warrior »

Не. Это не к задаче. Средняя загрузка процессора может держаться на уровне далеком от 0, даже если пользователь уже полночи спит. Пример? Задача бакапа по cron, выполнение любого длительного процесса не требующего участия пользователя. И обратное возможно - пользователь не торопясь набирает текст в mcedit.
*- Большинство проблем, дружок, завсегда покажет лог! -*
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: отслеживание действий пользователя в bash

Сообщение drBatty »

svary писал(а):
26.05.2009 06:31
Скажем, раз в 10 минут вызываем эту ф-цию, и если загрузка за последние 15 минут ниже порога - запускаем Ваш процесс...

не пойдёт -
drBatty писал(а):
25.05.2009 19:45
ага. а есть ещё "трудноуловимый баг в ядре", из-за которого всё тормозит, хотя загрузка 5%
ну а так-как 5%, то nice я как-то не ощущаю...


Mage-Warrior писал(а):
26.05.2009 08:33
Не. Это не к задаче. Средняя загрузка процессора может держаться на уровне далеком от 0, даже если пользователь уже полночи спит. Пример? Задача бакапа по cron,

мне и надо бекап по crond. только что-бы если я не сплю - бекап откладывался.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: отслеживание действий пользователя в bash

Сообщение Portnov »

Код: Выделить всё

[portnov]$ apt-cache show xautolock
Package: xautolock
Priority: optional
Section: x11
Installed-Size: 92
Maintainer: Roland Stigge <stigge@antcom.de>
Architecture: i386
Version: 1:2.1-7.1
Depends: libc6 (>= 2.7-1), libx11-6, libxext6, libxss1
Recommends: xlockmore | xtrlock | xscreensaver
Filename: pool/main/x/xautolock/xautolock_2.1-7.1_i386.deb
Size: 29356
MD5sum: 7d92a3c40668c7624f40e88c700f2bd7
SHA1: 822f35e5224cf745eb2243e1a72fec4aa1de0362
SHA256: 84a86ba261435e34477ab6387a2b7a319e40184b41a19d765c010af7bcb6cb70
Description: Program launcher for idle X sessions
 Xautolock monitors input devices under the X Window System, and launches a
 program of your choice if there is no activity after a user-configurable
 period of time.  You can use this to automatically start up a screen locker
 if you have left your computer unattended for some period of time.  The
 program launched need not be a screen locker such as xlock.
Tag: hardware::input, interface::x11, role::program, scope::utility, uitoolkit::gtk, use::monitor, x11::application, x11::screensaver

?
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: отслеживание действий пользователя в bash

Сообщение drBatty »

Portnov писал(а):
26.05.2009 21:04
?

не хочу ещё одну блокировку ставить. уже есть xscreensaver, он прекрасно работает. проблему решил так:

Код: Выделить всё

flag=""
while [ "$flag" = "" ]
do
    sleep 444
    flag=`sudo -uuser xscreensaver-command -time | sed -rn 's/^[^:]+: screen locked since //p'`
done

бекап запускается по расписанию, но не сразу, а через 444 сек после блокировки
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: