W poprzednim wpisie opisałem jak ograniczyć czasowo dostęp do wybranych stron, a w tym opiszę jak można śledzić czas spędzony przed komputerem. Koncepcja tego oprogramowania jest bardzo prosta, przed wyłączeniem komputera będzie wywoływany skrypt, który sprawdzał czas przez jaki był uruchomiony system i zapisywał odpowiednie dane do bazy danych.
Baza danych
Pierwszym elementem naszej układanki jest baza danych. Wykorzystamy bazę sqlite3. Baza będzię bardzo prosta. Będzię się ona składał jedynie z jednej tabeli zawierającej dwie kolumny- datę i czas użycia komputera w danym dniu. Bazę można utworzyć za pomocą poniższego skryptu:
import sqlite3
from datetime import date
conn = sqlite3.connect('/home/twójużytkownik/.time_monitor/time_monitor.db')
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS time ([date] TEXT PRIMARY KEY, time REAL)')
conn.commit()
conn.close()
Zwróć uwagę na ścieżkę do bazy, ustaw ją tak aby odpowiadała twojemu użytkownikowi.
Skrypt
Czas, który minął od uruchomienia komputera w Linuksie można znaleźć w pliku /proc/uptime. Trzeba odczytać pierwszą wartość. Wartość ta jest wyrażona w sekundach.
Dla ciekawskich, druga wartość w tym pliku oznacza czas spędzony “na biegu jałowym”(w sensie na idle’u) przez wszystkie rdzenie procesora zatem jeśli mamy conajmniej dwurdzeniowy procesor(ma ktoś jeszcze jednordzeniowe procesory w ogóle?) to ta wartość będzie najprawdopodobniej większa niż czas pracy komputera.
Kolejnym elementem jest skrypt aktualizujący bazę danych. Jest on bardzo prosty. Działanie skryptu można opisać w następujących punktach:
- Odczyt czasu pracy systemu i zamiana odczytanej wartości na minuty
- Podłączenie się do bazy danych i sprawdzenie czy istnieje rekord z aktualną datą
- Jeśli nie istnieje to tworzymy taki wpis i zapisujemy zmierzony czas pracy systemu
- Jeśli istnieje to odczytujemy wcześniejszą i dodajemy do niej aktualny czas pracy systemu
Skrypt wygląda następująco:
#!/usr/bin/python3
import sqlite3
from datetime import date
with open("/proc/uptime", "r") as f:
uptime = f.readline().split(' ')[0]
uptime = float(uptime) / 60
today = date.today()
conn = sqlite3.connect('/home/twójużytkownik/.time_monitor/time_monitor.db')
c = conn.cursor()
c.execute('SELECT * FROM time WHERE date="{}"'.format(today))
row = c.fetchall()
if len(row) == 0:
c.execute('INSERT INTO time VALUES ("{}", {})'.format(today, uptime))
else:
uptime += row[0][1]
c.execute('UPDATE time SET time={} WHERE date="{}"'.format(uptime, today))
conn.commit()
conn.close()
Oczywiście popraw ścieżkę do bazy danych tak aby odpowiadała lokalizacji na twoim komputerze.
Skrypt ten powinien być uruchamiany przed wyłączeniem systemu. Podobnie jak w przypadku oprogramowania z poprzedniego wpisu użyjemy systemd. Skopiuj zatem powyższy skrypt do katalogu /etc. Następnie utwórz plik time_monitor.service w katalogu /etc/systemd/system. Plik time_monitor.service ma następującą zawartość:
[Unit]
Description=Time monitoring script
DefaultDependencies=no
Before=shutdown.target
[Service]
Type=oneshot
ExecStart=/etc/time_monitor.py
TimeoutStartSec=0
[Install]
WantedBy=shutdown.target
Aby aktywować działanie wykonaj komendę:
# Wykonaj jako sudo lub root
systemctl enable website_scheduler.service
Sprawdzenie statystyk
Sprawdzenie swoich statystyk będzie polegało na odczycie danych z bazy danych, Najprościej to zrobić za pomocą sqlite3:
sqlite3 ~/.time_monitor/time_monitor.db
W bazie wykonujemy taką instrukcję SQLową:
SELECT * FROM time;
Komenda ta wydrukuje na ekran całą tabelę time. Aby dostać np. dane z ostatnich 10 dni można użyć komendy:
SELECT * FROM time ORDER BY date DESC LIMIT 10;
Teraz możemy monitorować czas spędzony przed komputerem. Kolejnym krokiem może być przygotowanie skrypty generującego wykresy przedstawiające zgromadzone dane.