Created by [CecilWesterhof]. I had some problems with the temperature of my CPU. So I wrote a systemd service (with Tcl) to log the temperature every minute to a SQLite database. And wrote the following script to display statistics of the last seven days and the last day: ====== #!/usr/bin/env tclsh package require sqlite3 # for getDB: my way to open the db database source /usr/local/share/tcltk/utilities.tcl set periodFormat " %10s | %4s | %4s | %7s | %5s" set periodDivider [string map {" " - | +} [format ${periodFormat} "" "" "" "" ""]] set periodSelect { SELECT * FROM temperatureStatistics WHERE date BETWEEN DATE('now', '-7 days') AND DATE('now', '-1 day') ORDER BY date DESC } set yesterdayFormat " %11s | %5s" set yesterdayDivider [string map {" " - | +} [format ${yesterdayFormat} "" ""]] set yesterdaySelect { SELECT Temperature , COUNT(*) AS Count FROM temperature WHERE date = DATE('now', '-1 day') GROUP BY Temperature ORDER BY Temperature DESC } getDB puts ${periodDivider} puts [format ${periodFormat} "Date " Min Max Average Total] puts ${periodDivider} db eval ${periodSelect} { puts [format ${periodFormat} ${Date} ${Minimum} ${Maximum} ${Average} ${Count}] } puts ${periodDivider} puts "" set i 0 set subtotal 0 set total 0 puts ${yesterdayDivider} puts [format ${yesterdayFormat} "Temperature" Total] puts ${yesterdayDivider} db eval ${yesterdaySelect} { puts [format ${yesterdayFormat} ${Temperature} ${Count}] incr i incr subtotal ${Count} incr total ${Count} if {[expr ${i} % 5] == 0} { puts ${yesterdayDivider} puts [format ${yesterdayFormat} "SubTotal" ${subtotal}] puts ${yesterdayDivider} set subtotal 0 } } if {[expr ${i} % 5] != 0} { puts ${yesterdayDivider} if {[expr ${i} % 5] > 1} { puts [format ${yesterdayFormat} "SubTotal" ${subtotal}] puts ${yesterdayDivider} set subtotal 0 } } puts [format ${yesterdayFormat} "Total" ${total}] puts ${yesterdayDivider} ====== I put this in a cronjob and the results of this morning where: ` ------------+------+------+---------+------ Date | Min | Max | Average | Total ------------+------+------+---------+------ 2017-12-19 | 40.5 | 67.0 | 45.5 | 1440 2017-12-18 | 43.5 | 70.5 | 48.1 | 1439 2017-12-17 | 43.5 | 65.5 | 55.1 | 1439 2017-12-16 | 60.5 | 77.5 | 64.1 | 1440 2017-12-15 | 61.5 | 77.5 | 63.9 | 1440 2017-12-14 | 57.5 | 77.5 | 62.4 | 1440 2017-12-13 | 46.0 | 77.0 | 54.1 | 1440 ------------+------+------+---------+------ -------------+------ Temperature | Total -------------+------ 67.0 | 1 66.5 | 3 66.0 | 1 65.0 | 4 64.5 | 18 -------------+------ SubTotal | 27 -------------+------ 64.0 | 4 63.5 | 11 63.0 | 2 62.5 | 10 62.0 | 10 -------------+------ SubTotal | 37 -------------+------ 61.5 | 5 61.0 | 1 60.5 | 5 60.0 | 2 59.5 | 1 -------------+------ SubTotal | 14 -------------+------ 59.0 | 1 58.5 | 4 57.5 | 3 57.0 | 1 56.5 | 6 -------------+------ SubTotal | 15 -------------+------ 56.0 | 1 55.5 | 2 53.5 | 4 53.0 | 5 52.5 | 5 -------------+------ SubTotal | 17 -------------+------ 52.0 | 3 51.5 | 2 51.0 | 4 50.5 | 8 50.0 | 7 -------------+------ SubTotal | 24 -------------+------ 49.5 | 13 49.0 | 14 48.5 | 19 48.0 | 22 47.5 | 24 -------------+------ SubTotal | 92 -------------+------ 47.0 | 27 46.5 | 56 46.0 | 79 45.5 | 105 45.0 | 188 -------------+------ SubTotal | 455 -------------+------ 44.5 | 162 44.0 | 73 43.5 | 40 43.0 | 53 42.5 | 70 -------------+------ SubTotal | 398 -------------+------ 42.0 | 96 41.5 | 161 41.0 | 96 40.5 | 8 -------------+------ SubTotal | 361 -------------+------ Total | 1440 -------------+------ ` If people are interested in my systemd service: I can share that also. Comments and tips are appreciated. I was asked what getDB does. Here it is: ====== proc getDB {} { if {${::argc} != 1} { error [format "ERROR: %s DATABASE" [getScriptName]] } sqlite db [lindex ${::argv} 0] db timeout [expr {10 * 1000}] } ====== And it uses getScriptName: ====== proc getScriptName {} { file tail ${::argv0} } ====== I will also share the systemd service and the table and publish the code on GitHub. <>CPU usage | System Maintenance