neděle 13. ledna 2013

Teplota disků v Conky, když proměnná hddtemp nestíhá

Již před lety jsem tu psal o několika svých skriptech pro Conky, z nichž nejzajímavější je rozhodně ten pro komplexní sledování filesystémů, který monitoruje na minimu místa většinu zajímavých parametrů, včetně jejich aktivity a dokáže v Conky dynamicky přidávat a samozřejmě i odebírat filesystémy, podle toho jak je připojujete a odpojujete. Jedním z monitorovaných parametrů je i teplota disků a tady jsem již v minulosti narazil na to, že proměnná hddtemp v Conky není spolehlivá, pokud má v jednom zátahu dodat teplotu k více, než jednomu disku. Každou chvíli se zobrazuje N/A, místo teploty. ...



hddtemp je démon, který běží v systému (pokud máte hddtemp nainstalovaný a spuštěný) a monitoruje teplotu připojených disků přes S.M.A.R.T. (pokud je k mání). Když si jako root zkusíte spustit příkaz hddtemp s parametrem ve formátu /dev/sdx, vypíše vám teplotu daného disku, pokud je dostupná, ale může to trvat poměrně dlouho, třeba sekundu, záleží na hardware. Conky za běžných okolností pod rootem neběží, proto nemůže využívat tento přístup, ale hddtemp démon dává data k dispozici i přes síťový port 7634 (pokud není změněno v /etc/default/hddtemp) a tak ho mohou číst všichni, kteří mají k danému portu na konkrétním systému přístup, tedy i běžní uživatelé. Předpokladem tedy je, že conky bude využívat tento zdroj. Pravda je ovšem taková, že rychlost odezvy hddtemp proměnné v conky odpovídá shellovému příkazu hddtemp a to způsobuje nedostupnost požadovaných dat, pokud jich chci více za sebou v jednom cyklu. Občas dostanu první hodnotu a ostatní jsou N/A, v ostatních případech dostanu N/A všude.

Dřív jsem ten problém pociťoval méně, teplotu tří disků conky zobrazoval sice nespolehlivě, ale dalo se říct, že většinou se zobrazily alespň dvě teploty ze tří, někdy dokonce všechny. V poslední době jsem systém trochu překopal, přibylo více disků připojovaných dynamicky a já přidal monitoring teploty pro všechny monitorované filesystémy do mého externího skriptu. Jak požadavků přibylo začal jsem dostávat N/A pro všechny disky, jen ten první se občas zobrazil na tu sekundu, kterou mám nastavenou pro aktualizaci conky. To mě nakrklo a protože jsem věděl, že z shellu se k datům dostanu i přes síť, zkusil jsem odezvu přes příkaz netcat (nc). A odezva byla blesková, naprosto dostačující k tomu, abych takto zjistil teplotu k desítce disků za tu sekundu.

Nejde mi do hlavy proč to conky nezvládá interní funkcí rychleji, ale na druhou stranu to má alespoň triviální řešení, které jsem zbastlil za pár minut. Mám tedy další externí skript, který pro změnu vrací teplotu disku, nebo nic, když není dostupná.

hddtemp
#!/bin/bash
# vrací teplotu disku, pokud je dostupná hddtemp
# parametrem je cesta k disku ve formátu /dev/sdx
# protože je parametr použit jako regulární výraz, je možno použít i samotné sdx
# nebo i část jména disku, pokud nehrozí, že bude duplicitní

dev=$1
temp="`netcat localhost 7634|sed 's/||/|\n|/g'|
  awk -v dev=$dev 'BEGIN{FS="|"}; $0~dev{print $4}'`"
if [ $temp ]; then echo "$temp°C"; fi

Použití z conky, pokud skript dáte do souboru ~/.conky/hddtemp je tedy jasné:

${exec ~/.conky/hddtemp /dev/sdx}

přičemž sdx nahradíte diskem, který vás zajímá. Samozřejmě je nutné skriptu nastavit spustitelný přízrak. Nebo lépe příznak.

Teplotu disků rozhodně není nutné kontrolovat každou sekundu, takže můžete použít i proměnné $execi s delším intervalem.

Ovšem to by to bylo moc jednoduché, napsal jsem předchozí skript a zjistil, že u jednoho nového (i když staršího :) disku jsem stále bez teploty, ačkoliv utilita Disks v Ubuntu teplotu zobrazuje korektně. Bohužel hddtemp není připraven na vše. Podle mých testů selhává tehdy, když S.M.A.R.T. obsahuje místo parametru 'Temperature_Celsius' parametr 'Airflow Temperature_Cel'. Peklo. A tohle sice umím také obejít, pomocí utility smartctl z balíku smartmontools, ale již ne bez roota. Tedy musel bych si napsat vlastního démona běžícího pod rootem, což není problém, ale dnes se mi tedy už nechce. A třeba to už někdo udělal, co já vím...

Edit:
Když jsem se trochu zamyslel nad sedem, trochu jsem skript zjednodušil a asi o třetinu zrychlil. Paramerem nyní může být jen jméno disku v /dev/ bez celé cesty.

hddtemp
#!/bin/bash
# vrací teplotu disku, pokud je dostupná hddtemp
# parametrem je jméno disku v adresáři /dev/, tedy ve formátu sd[x]

nc localhost 7634|sed -n "s/^.*$1[^|]*|[^|]*|\(..\)..[||\|$].*/\1°C/p"


Žádné komentáře:

Okomentovat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.