Вопрос или проблема
Я ищу простой способ определить примерное количество времени, которое я провожу за компьютером каждый день. Это может быть сложной задачей, если пытаться отслеживать процессы, нажатия клавиш, клики мышью и подобное, потому что человек может заниматься чем угодно: размышлять над задачей по программированию, читать веб-статью, разговаривать по телефону или гулять с собакой. Компьютер не может читать мои мысли. Поскольку я оставляю компьютеры включенными 24 часа в сутки, мониторинг входов не сработает.
Я пришел к идее логировать, сколько времени компьютер проводит в режиме заставки. Моя ошибка тогда не будет больше, чем произведение времени простоя до заставки на количество раз, когда она активируется. Вычитание этого из 24 часов даст мне оценку, которая будет разумной для моих целей.
Проблема в том, что я не знаю, как логировать, когда заставка включается и выключается. В данный момент я использую Ubuntu 10.10 на большинстве машин и собираюсь начать обновление до 11.04 на некоторых из них.
Есть какие-либо идеи?
[редактировать] После более тщательных поисков я наткнулся на dbus-monitor, который, похоже, может работать, но ему не хватает важного ингредиента. Вот скрипт, который я запускаю, он запускает монитор в качестве демона:
#!/bin/bash
RUNNING=`ps -A | grep "dbus-monitor"`
if [ ! $RUNNING ]; then
echo "(Перезапуск) демона dbus-monitor"
nohup dbus-monitor "--profile" "type="signal",interface="org.gnome.ScreenSaver"" >> ${HOME}/sc.log &
fi
Вот вывод, который он производит после блокировки и разблокировки экрана несколько раз:
sig 1304860712 153829 2 /org/freedesktop/DBus org.freedesktop.DBus NameAcquired
sig 1304860717 318732 462 /org/gnome/ScreenSaver org.gnome.ScreenSaver ActiveChanged
sig 1304860725 547928 463 /org/gnome/ScreenSaver org.gnome.ScreenSaver ActiveChanged
sig 1304861018 17 464 /org/gnome/ScreenSaver org.gnome.ScreenSaver ActiveChanged
sig 1304862919 403523 466 /org/gnome/ScreenSaver org.gnome.ScreenSaver ActiveChanged
Второй столбец, очевидно, представляет собой unix UTC в секундах. Недостающим ингредиентом является то, что он не указывает, включена ли заставка! Я предположу, что они переключаются с момента, когда происходит NameAcquired, но меня беспокоит, что может быть пропущено или добавлено событие, которое я не могу предвидеть, что нарушит всю синхронизацию.
Буду признателен за идеи.
jkcunningham
Я хотел бы поблагодарить и внести свой вклад простым, сырьевым скриптом (его можно улучшить), поместив его в стартовые приложения с помощью:
xterm -e logSessionLock.sh
он также готов к системным сбоям/обрывам. Он не прошел серьезного тестирования… но пока работает отлично. Он создаст 2 файла: один в $HOME (лог), другой в /tmp (обходное решение для системных сбоев)
logSessionLock.sh
#!/bin/bash
logFile="."`basename $0`".log"
function FUNClog {
strTime=`gnome-screensaver-command --time`
strDate=`date +"%Y%m%d-%H%M%S"`
strLog="$strDate ($1) $strTime"
}
function FUNCwriteLog {
echo $strLog >>$HOME/$logFile
echo $strLog
}
active=false
firstTime=true
# восстанавливает последнюю запись в логе в случае системного сбоя
strLog=`cat "/tmp/$logFile.tmp"`
FUNCwriteLog
echo "" >"/tmp/$logFile.tmp"
if [[ -n "$strLog" ]]; then #если есть, значит он был активен, когда система упала
active=true
fi
while true; do
if gnome-screensaver-command --query |grep -q "The screensaver is active"; then
if ! $active; then
# восстановить сохраненный временный лог
strLog=`cat "/tmp/$logFile.tmp"`
FUNCwriteLog
# обновить лог (может ли это быть выключено, когда достигается эта строка? однажды это, кажется, произошло...)
FUNClog BEGIN
FUNCwriteLog #логирует время начала
active=true
else
FUNClog ON #сохраняет количество времени, в течение которого заставка была ВКЛЮЧЕНА
echo $strLog >"/tmp/$logFile.tmp"
fi
else
if $active; then
FUNCwriteLog #сохраняет количество времени, в течение которого заставка была ВКЛЮЧЕНА
FUNClog OFF
FUNCwriteLog
echo "" >"/tmp/$logFile.tmp"
active=false
fi
fi
sleep 1
done
лог выглядит так:
20120214-191528 (BEGIN) Заставка была активна в течение 0 секунд.
20120214-193602 (ON) Заставка была активна в течение 1234 секунд.
20120214-193603 (OFF) Заставка в данный момент не активна.
Пакет “Workrave” не только отслеживает, используете ли вы свой компьютер, и помогает вам делать перерывы в течение дня, но также предоставляет приятный набор статистики как в сыром виде (в текстовом файле), так и через графический интерфейс (Ежедневное использование: 5:41:00 за 21 июля
). Статистика также включает такие данные, как минуты использования мыши, расстояние движения мыши, нажатия клавиш и т. д.
Установите его из официальных репозиториев, добавьте в свою панель, щелкните правой кнопкой мыши и выберите “статистика”. Вы получите календарь, чтобы выбрать день, о котором хотите узнать. Или посмотрите данные в ~/.workrave/historystats
Если вы уберете –profile, вы получите формат без временных меток, но с указанием, активна ли заставка или нет.
$ dbus-monitor "type="signal",interface="org.gnome.ScreenSaver"
...
signal sender=:1.46 -> dest=(null destination) serial=1881 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean true
Я использовал модификацию этого php-скрипта, чтобы активировать или деактивировать вещи на основе моей заставки
#!/usr/bin/php
<?php
$handle = popen("dbus-monitor 'path=/org/gnome/ScreenSaver, member=ActiveChanged' 2>&1", 'r');
echo "'$handle'; " . gettype($handle) . "\n";
while (!feof($handle)) {
$read = fgets($handle);
if(preg_match("/^\s+boolean (\w+)/", $read, $matches))
{
$active = ($matches[1] == 'true');
// сделай что-то здесь
}
}
pclose($handle);
?>
Другой вариант — использовать gnome-screensaver-command --query
. Используя crontab, я позволяю bitcoin использовать все 4 ядра, когда заставка активна, но он использует только 1 ядро, когда я работаю за компьютером.
DISPLAY=":0.0"
* * * * * if gnome-screensaver-command --query 2>&1 | grep -q 'is active'; then bitcoind setgenerate true 4; else bitcoind setgenerate true 1; fi
DISPLAY: Без установки DISPLAY команда gnome-screensaver-command не сможет найти экран, когда она запускается из cron. Это должно выполняться под тем же пользователем, который вошел в систему.
2>&1
: Это перенаправляет любые ошибки в стандартный вывод, который захватывается…
| grep -q 'is active';
: -q делает grep тихим, он ничего не выводит. Но команда возвращает успешный или неудачный результат, который используется в if.
Я понимаю, что ни один из этих вариантов не является полным решением, но, надеюсь, их достаточно, чтобы вы могли начать.
Это более полный скрипт. Вы можете запускать его из cron каждую минуту, и если заставка активна, он будет записывать, сколько времени она была активна. Как только она деактивируется, он возьмет последнее измерение и добавит его в ~/Screensaver.log. Если запускать его из cron, оно может быть неточным до 59 секунд каждый раз, когда заставка деактивируется.
#!/bin/bash
export DISPLAY=':0'
if gnome-screensaver-command -q 2>&1 | grep -q 'is active'; then
# это перезапишет файл каждый раз.
gnome-screensaver-command --time > /tmp/ScreensaverActiveTime
# если заставка не активна, и у нас есть файл с прошлого раза, когда он работал...
elif [ -e /tmp/ScreensaverActiveTime ]; then
# добавляем его в наш лог и ...
cat /tmp/ScreensaverActiveTime >> ~/Screensaver.log
# удаляем файл. Он будет воссоздан, когда заставка снова активируется.
rm /tmp/ScreensaverActiveTime
fi
xprintidle – утилита, печатающая время бездействия пользователя в X
Получите историю временных меток начала/конца заставки Нажмите здесь
Я использую команду uptime
, но она не дает времени активности/неактивности системы.
uptime отображает в одной строке следующую информацию: текущее время, сколько времени система работает, сколько пользователей в настоящее время вошли в систему и средние нагрузки системы за последние 1, 5 и 15 минут.
Ответ или решение
Чтобы измерить время использования компьютера на основе активности экрана (включен или выключен экран saver), вы можете использовать несколько подходов. Ниже приводится полное решение вашей задачи с шагами, которые нужно предпринять для реализации этого подхода.
1. Использование dbus-monitor
Вы уже начали настраивать dbus-monitor
, что является хорошим первым шагом. Вот шаги, которые вам необходимо предпринять для логирования времени, когда экранный saver активен и неактивен.
-
Установка dbus-monitor: Убедитесь, что у вас установлен пакет
dbus
иgnome-screensaver
. Обычно он предустановлен в дистрибутивах Ubuntu, однако вы можете проверить его наличие с помощью команды:sudo apt-get install dbus gnome-screensaver
-
Создание скрипта для наблюдения за состоянием screensaver: Создайте файл скрипта, который будет запускать
dbus-monitor
и логировать изменения состояния screensaver. Вот пример скрипта:
#!/bin/bash
logFile="${HOME}/screensaver_usage.log"
tempFile="/tmp/screensaver_state.tmp"
active=false
# Функция для логирования
log_time() {
local state=$1
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "${timestamp} - Screensaver is ${state}" >> "${logFile}"
}
# Запуск dbus-monitor
dbus-monitor "type='signal',interface='org.gnome.ScreenSaver'" | while read line; do
if [[ "$line" == *"ActiveChanged"* ]]; then
if [[ "$active" == true ]]; then
log_time "OFF"
active=false
else
log_time "ON"
active=true
fi
fi
done
- Запуск скрипта: Дайте права на выполнение вашему скрипту:
chmod +x /path/to/your_script.sh
Затем запустите его:
/path/to/your_script.sh &
Этот скрипт будет постоянно следить за состоянием screensaver и записывать соответствующие изменения в лог-файл.
2. Использование gnome-screensaver-command для периодической проверки
Вместо постоянного мониторинга при помощи dbus-monitor
, вы можете использовать gnome-screensaver-command
в cron-расписании, чтобы проверять состояние screensaver каждые несколько минут.
-
Создание cron-задания:
Откройте ваше crontab:crontab -e
-
Добавьте следующее задание: Это будет проверять состояние screensaver каждую минуту и логировать, если он активен:
* * * * * DISPLAY=:0 gnome-screensaver-command -q | grep -q 'is active' && echo "$(date) - Screensaver active" >> ~/screensaver_usage.log
3. Анализ лога вывода
После того как вы записываете события, вы можете анализировать ваш лог-файл, чтобы подсчитать общее время, которое вы провели с активированным screensaver. Вы можете использовать awk
, grep
или любой другой скриптовый язык для обработки данных.
Заключение
Эти шаги помогут вам установить мониторинг активности вашего компьютера на основе времени, в течение которого screensaver был активен или неактивен. Модифицируя предложенные скрипты и подходы, вы сможете получить более точные данные о времени использования. Вы можете настроить логирование, чтобы учитывать ошибки и возможные сбои в системе, а также делать резервные копии данных на случай сбоя.
Дополнительные ресурсы
Если вас интересуют более продвинутые статистики о вашем использовании компьютера, вы можете рассмотреть установку программного обеспечения, такого как Workrave, который ведет учет как времени использования, так и количества нажатий клавиш и движения мыши, предоставляя удобный графический интерфейс для анализа данных.
Убедитесь, что вы оставляете свой компьютер в спокойном состоянии, если хотите получить точные результаты: планируйте свои перерывы и используйте активные сети, чтобы отслеживать ваши действия.