Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Conky [Vyřešeno]  (Přečteno 28015 krát)

ikx

  • Aktivní člen
  • *
  • Příspěvků: 476
Re:Conky [Vyřešeno]
« Odpověď #125 kdy: 10 Června 2022, 08:09:25 »

Ventero

  • Závislák
  • ***
  • Příspěvků: 3549
Re:Conky [Vyřešeno]
« Odpověď #126 kdy: 10 Června 2022, 09:55:15 »
Vypadá dobře - Byť to selftest má, tak mi tam chybí kontrola sektorů se zobrazením vč adresy, jako u HDTune Pro.

A Linux verze koukám umí podle všeho prd - jen zobrazit pár hodnot.
No asi se v Linuxu nedočkáme plnohodnotného nástroje pro kontrolu disků - přitom to nemůže být kdovíjaká nálož - ve Win používám vypreparovaný exáč, který má jen něco přes 300kB ...
« Poslední změna: 10 Června 2022, 10:19:04 od Ventero »
Zvuky jsou mantrami a myšlenky moudrostí, prostě proto, že se mohou objevovat ...

juwa2

  • Závislák
  • ***
  • Příspěvků: 4936
Re:Conky [Vyřešeno]
« Odpověď #127 kdy: 10 Června 2022, 15:07:08 »
A s tím učkem na konci?
usb_storage.quirks=0bc2:61b7:u

Výsledek stejný.... :-[

juwa2

  • Závislák
  • ***
  • Příspěvků: 4936
Re:Conky [Vyřešeno]
« Odpověď #128 kdy: 10 Června 2022, 19:07:02 »
Vyzkoušel jsem ten hdsentinel konzolovou verzi a zdá se použitelný.
A hlavně - zobrazuje parametry všech externích USB disků:)
Soubor nakopírujeme třeba do /usr/bin a upravíme mu vlastnictví/práva:
Kód: [Vybrat]
sudo chown root:root /usr/bin/hdsentinel
sudo chmod u+s /usr/bin/hdsentinel

Pak funguje s právy roota (bez sudo), tj. je přímo použitelný v conky.
Konkrétní implementace může být různá, v závislosti na použitých parametrech (hdsentinelu). Já to vyřešil takto:
Kód: [Vybrat]
Temp: sda ${hddtemp /dev/sda}°C sdb ${hddtemp /dev/sdb}°C ${if_existing /dev/sdc} sdc ${execi 60 hdsentinel -solid -dev /dev/sdc | cut -c 10-11}°C ${endif} ${if_existing /dev/sdd} sdd ${execi 60 hdsentinel -solid -dev /dev/sdd | cut -c 10-11}°C ${endif}
Případné další externí disky lze snadno přidat. Pokud nejsou připojené, nic se na jejich pozici nezobrazuje.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Ještě poznámka k hddtemp (tomu vnitřnímu co je v conky). Po rebootu se přestala zobrazovat teplota disků (N/A).
Conky spuštěné z terminálu hlásilo "could not connect to hddtemp host"  Přitom služba hddtemp.service  běžela, jak bylo zjištěno pomocí příkazu
Kód: [Vybrat]
sudo systemctl status hddtemp.service
Vyřešila to editace souboru /etc/default/hddtemp  Kde byl změněn řádek  RUN_DAEMON="false"  =>  RUN_DAEMON="true"
A byl proveden restart služby
Kód: [Vybrat]
sudo systemctl restart hddtemp.service
« Poslední změna: 10 Června 2022, 21:23:17 od juwa2 »

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #129 kdy: 11 Června 2022, 06:33:17 »
Kouknul a nainstaloval jsem si HDSentinel. Musím říct, že s problémy. https://www.hdsentinel.com/hdslin/hdsentinel-019c-x64.gz po rozbalení a nastavení práv u mne nejde spustit, hází to chybu souboru. Až tento script https://www.hdsentinel.com/hdslin/installers/HDSxterm64Installer.run pomohl. Ač tvůrci píšou podporu disků nvme u mne to zkrátka nefunguje. Externí disk vidí a pracuje s ním v pořádku. Má pěkně zpracovaný výstup pomocí přepínače -solid. Tím ty pěkné věci z mého pohledu končí. Neštimuje se mi uzavřený kód. Což bych v určitých případech (super funkčnost, atd) překousl. Avšak můj oblíbený test tento program zavrhl:
Kód: [Vybrat]
sudo strace HDSentinel -solid -dev /dev/sda 2> hdsen1.txt
sudo time HDSentinel -solid -dev /dev/sda
Pro porovnání smartctl:
Kód: [Vybrat]
sudo strace smartctl -A /dev/sda 2> smart1.txt
sudo time smartctl -A /dev/sda | grep ^194
strace má zvláštnost, že jeho výstup posílá na standardní chybový výstup. Proto jsem musel použít 2>. U smartctl jsem ještě navíc (v jeho neprospěch) použil grep ^194 aby byl výstup také jednořádkový. 194 je SMART ID teploty tohoto disku.
Výsledek vezmu od zadu.
time  HDSentinel ("roztočený" disk):
real   0m0,505s
user   0m0,000s
sys   0m0,009s

time HDSentinel (uspaný disk):
real   0m2,386s
user   0m0,000s
sys   0m0,009s

time smartctl (roztočený disk):
real   0m0,338s
user   0m0,017s
sys   0m0,005s

time smartctl (uspaný disk):
real   0m2,240s
user   0m0,016s
sys   0m0,007s

smartctl ještě na víc s grepem je rychlejší!

velikost výstupu strace (přehled kollik to spotřebuje systémových prostředků):
HDSentinel:
du -b hdsen1.txt
23198   hdsen1.txt

smartctl:
du -b smart1.txt
20350   smart1.txt

smartctl potřebuje o 12% méně.
Za mne je smartctl jasný vítěz a to ještě navíc umí nvme disky.

To juwa2, copak Ti vypíše toto?
Kód: [Vybrat]
sudo smartctl -a /dev/sdc
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

juwa2

  • Závislák
  • ***
  • Příspěvků: 4936
Re:Conky [Vyřešeno]
« Odpověď #130 kdy: 11 Června 2022, 11:41:21 »
Kód: [Vybrat]
juwa@p-5738:~$ sudo smartctl -a /dev/sdc
[sudo] heslo pro juwa:         
smartctl 6.6 2016-05-31 r4324 [x86_64-linux-5.4.196-0504196-lowlatency] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

/dev/sdc: Unknown USB bridge [0x152d:0x0578 (0x100)]
Please specify device type with the -d option.

Use smartctl -h to get a usage summary

Takže jsem postupně zkoušel různé parametry/přepínače a konečně příkaz
Kód: [Vybrat]
sudo smartctl -l scttemp -d sat /dev/sdc
Zobrazil správnou teplotu 38 C (která by šla vyfiltrovat)
Kód: [Vybrat]
juwa@p-5738:~$ sudo smartctl -l scttemp -d sat /dev/sdc
smartctl 6.6 2016-05-31 r4324 [x86_64-linux-5.4.196-0504196-lowlatency] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        SMART Off-line Data Collection executing in background (4)
Current Temperature:                    38 Celsius
Power Cycle Min/Max Temperature:     27/41 Celsius
Lifetime    Min/Max Temperature:     20/43 Celsius
Under/Over Temperature Limit Count:   0/0

SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        1 minute
Min/Max recommended Temperature:      0/60 Celsius
Min/Max Temperature Limit:           -40/70 Celsius
Temperature History Size (Index):    128 (39)

Index    Estimated Time   Temperature Celsius
  40    2022-06-11 09:47    38  *******************
 ...    ..(126 skipped).    ..  *******************
  39    2022-06-11 11:54    38  *******************

Jinak ten hdsentinel má u mě pouze jednu menší chybku. U externích disků které mají aktivní uspávání (po 10 min. nečinnosti) toto není funkční.
Jelikož si ta aplikace každou minutu na ten disk "sahá" pomocí exec. Ale domnívám se, že u smartctl to bude stejné...

Taky jsem zkoušel kernel 5.6 který má podporu modulu drivetemp. Modul spustit šel, teploty interních disků hwmon zobrazoval, externích nikoli.
Ale stejně ten kernel už není záplatovaný a novější do U18.04.6 nedostanu (nesplnitelné závislosti verze libc6 atd. - to ostatně vidím poprvé...)
Takže stejně pojedu na 5.4 HWE až do konce EOL
« Poslední změna: 11 Června 2022, 12:05:04 od juwa2 »

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #131 kdy: 11 Června 2022, 12:41:04 »
To vypadá velmi nadějně. Dík za vyčerpávající odpověď. Já se dopracoval jak ten disk neprobouzet:
sudo smartctl  -d sat -n standby /dev/sda
Pokud se disk "nepoužívá", vrátí to hodnotu Device is in STANDBY mode, exit(2). Což je fajn. Nemusí se hlídat teplota disku který ač připojen se nepoužívá (nehřeje se).
Hodně použitelný je přepínač -j (json). Unifikuje výstup do formátu json aniž by musel člověk hledat které to ID je správné. Jinak hddtemp ty disky také udržuje roztočené. Já se dnes ráno na tom zasekl při psaní skriptu, jak vyřešit to "točení". Pokud se jednou disk roztočí, tak už nemá cenu každou chvíli testovat jestli spí nebo ne. Páč kdy nespí, tak se načte hodnota, která ho točí dál a nemůže usnout ...  :)
Ještě bych poprosil o výstup:
Kód: [Vybrat]
sudo smartctl -d sat -a /dev/sdc
Při hraní abych nemusel čekat než zase disk usne mu to zadávám růčo:
Kód: [Vybrat]
sudo hdparm -y /dev/sda
a pak spí jak miminko  ;D
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

juwa2

  • Závislák
  • ***
  • Příspěvků: 4936
Re:Conky [Vyřešeno]
« Odpověď #132 kdy: 11 Června 2022, 13:24:25 »
Kód: [Vybrat]
juwa@p-5738:~$ sudo smartctl -d sat -a /dev/sdc
[sudo] heslo pro juwa:         
smartctl 6.6 2016-05-31 r4324 [x86_64-linux-5.4.196-0504196-lowlatency] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     TOSHIBA HDWD110
Serial Number:    80HM91VFS
LU WWN Device Id: 5 000039 fdff30b92
Firmware Version: MS2OA8R0
User Capacity:    1 000 204 886 016 bytes [1,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Form Factor:      3.5 inches
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   ATA8-ACS T13/1699-D revision 4
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Sat Jun 11 13:23:27 2022 CEST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART Status not supported: Incomplete response, ATA output registers missing
SMART overall-health self-assessment test result: PASSED
Warning: This result is based on an Attribute check.

General SMART Values:
Offline data collection status:  (0x84) Offline data collection activity
was suspended by an interrupting command from host.
Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
without error or no self-test has ever
been run.
Total time to complete Offline
data collection: ( 7070) seconds.
Offline data collection
capabilities: (0x5b) SMART execute Offline immediate.
Auto Offline data collection on/off support.
Suspend Offline collection upon new
command.
Offline surface scan supported.
Self-test supported.
No Conveyance Self-test supported.
Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
power-saving mode.
Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
General Purpose Logging supported.
Short self-test routine
recommended polling time: (   1) minutes.
Extended self-test routine
recommended polling time: ( 118) minutes.
SCT capabilities:        (0x003d) SCT Status supported.
SCT Error Recovery Control supported.
SCT Feature Control supported.
SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000b   100   100   016    Pre-fail  Always       -       0
  2 Throughput_Performance  0x0005   141   141   054    Pre-fail  Offline      -       72
  3 Spin_Up_Time            0x0007   113   113   024    Pre-fail  Always       -       202 (Average 202)
  4 Start_Stop_Count        0x0012   100   100   000    Old_age   Always       -       543
  5 Reallocated_Sector_Ct   0x0033   100   100   005    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000b   100   100   067    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0005   110   110   020    Pre-fail  Offline      -       36
  9 Power_On_Hours          0x0012   099   099   000    Old_age   Always       -       8542
 10 Spin_Retry_Count        0x0013   100   100   060    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       70
192 Power-Off_Retract_Count 0x0032   100   100   000    Old_age   Always       -       545
193 Load_Cycle_Count        0x0012   100   100   000    Old_age   Always       -       545
194 Temperature_Celsius     0x0002   157   157   000    Old_age   Always       -       38 (Min/Max 20/43)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0022   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0008   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x000a   200   200   000    Old_age   Always       -       6

SMART Error Log Version: 1
ATA Error Count: 6 (device log contains only the most recent five errors)
CR = Command Register [HEX]
FR = Features Register [HEX]
SC = Sector Count Register [HEX]
SN = Sector Number Register [HEX]
CL = Cylinder Low Register [HEX]
CH = Cylinder High Register [HEX]
DH = Device/Head Register [HEX]
DC = Device Command Register [HEX]
ER = Error register [HEX]
ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 6 occurred at disk power-on lifetime: 41 hours (1 days + 17 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 f7 82 6f 0b  Error: ICRC, ABRT 1 sectors at LBA = 0x0b6f82f7 = 191857399

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  35 00 08 f0 82 6f e0 00      01:13:59.295  WRITE DMA EXT
  35 00 08 90 82 6f e0 00      01:13:59.287  WRITE DMA EXT
  35 00 08 e8 81 6f e0 00      01:13:59.280  WRITE DMA EXT
  35 00 10 98 81 6f e0 00      01:13:59.266  WRITE DMA EXT
  35 00 08 88 81 6f e0 00      01:13:59.258  WRITE DMA EXT

Error 5 occurred at disk power-on lifetime: 41 hours (1 days + 17 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 21 87 28 86 03  Error: ICRC, ABRT 33 sectors at LBA = 0x03862887 = 59123847

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  35 00 80 28 28 86 e0 00      01:13:23.704  WRITE DMA EXT
  35 00 80 a8 27 86 e0 00      01:13:23.615  WRITE DMA EXT
  35 00 80 28 27 86 e0 00      01:13:23.524  WRITE DMA EXT
  35 00 80 a8 26 86 e0 00      01:13:23.431  WRITE DMA EXT
  35 00 80 28 26 86 e0 00      01:13:23.339  WRITE DMA EXT

Error 4 occurred at disk power-on lifetime: 41 hours (1 days + 17 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 21 87 f9 85 03  Error: ICRC, ABRT 33 sectors at LBA = 0x0385f987 = 59111815

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  35 00 80 28 f9 85 e0 00      01:13:14.914  WRITE DMA EXT
  35 00 80 a8 f8 85 e0 00      01:13:14.826  WRITE DMA EXT
  35 00 80 28 f8 85 e0 00      01:13:14.733  WRITE DMA EXT
  35 00 80 a8 f7 85 e0 00      01:13:14.651  WRITE DMA EXT
  35 00 80 28 f7 85 e0 00      01:13:14.558  WRITE DMA EXT

Error 3 occurred at disk power-on lifetime: 41 hours (1 days + 17 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 a7 ea 85 03  Error: ICRC, ABRT 1 sectors at LBA = 0x0385eaa7 = 59108007

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  35 00 80 28 ea 85 e0 00      01:13:11.948  WRITE DMA EXT
  35 00 80 a8 e9 85 e0 00      01:13:11.866  WRITE DMA EXT
  35 00 80 28 e9 85 e0 00      01:13:11.785  WRITE DMA EXT
  35 00 80 a8 e8 85 e0 00      01:13:11.703  WRITE DMA EXT
  35 00 80 28 e8 85 e0 00      01:13:11.615  WRITE DMA EXT

Error 2 occurred at disk power-on lifetime: 41 hours (1 days + 17 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 21 07 94 85 03  Error: ICRC, ABRT 33 sectors at LBA = 0x03859407 = 59085831

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  35 00 80 a8 93 85 e0 00      01:12:55.978  WRITE DMA EXT
  35 00 80 28 93 85 e0 00      01:12:55.884  WRITE DMA EXT
  35 00 80 a8 92 85 e0 00      01:12:55.794  WRITE DMA EXT
  35 00 80 28 92 85 e0 00      01:12:55.711  WRITE DMA EXT
  35 00 80 a8 91 85 e0 00      01:12:55.628  WRITE DMA EXT

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%         0         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

A ještě k tomu probouzení. Pokud má disk (vnitřně, to je dané) nastaven interval uspání na 10 min. nečinnosti, pak musí logicky být interval kontroly větší, tj. alespoň 11 min. Protože pokud se bude každou minutu kontrolovat teplota, disk nikdy do spánku (sám) nepřejde....
Navíc musím používat pro ext. disky  hddtemp -d sat /dev/sdx   přičemž parametr -n funguje jenom při -d ata. Je to ostatně uvedeno v helpu... Takže si můžu vybrat - buď zobrazení teplot nebo uspávání. Příkaz do conky pak vypadá takto:
Kód: [Vybrat]
${if_existing /dev/sdc}sdc ${execi 60 smartctl -l scttemp -d sat /dev/sdc | grep "Current Temperature" | cut -c 41-42}°C ${endif}
« Poslední změna: 11 Června 2022, 23:30:08 od juwa2 »

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #133 kdy: 13 Června 2022, 23:22:53 »
Uff, tak mám něco hotovo. Vše co šlo se přitom po... Kaput neovim po nějaké aktualizaci a nevím přesně které. No a psát něco v nano je víc než masochismus. Takže po různých testech mě neovim naběhl plně funkční až když jsem si dal do ppa unstable verzi a nainstaloval tu nejvyšší. Před tím downgrading samotného a závislostí také nepomohl. A tak jsem konečně mohl zase psát...
Přiložím pár skriptů. A i když to u mne funguje na 100% U ženy PC nemám šanci to rozběhnout z důvodu staré verze smartmontools --> 6.6 která ještě nemá přepínač --json. Je z roku 2016 a vyšší do toho starého systému nejde dát.

Takže v conky se teploty načítají tímto řádkem:
Kód: [Vybrat]
${head /tmp/conky_honky_tonky 1}

Aby to fungovalo je třeba vytvořit soubor /usr/local/sbin/conkys.sh a uložit do něho toto:
Kód: [Vybrat]
#! /usr/bin/env bash

# script přijímá jen jeden parametr a to adresu disku za /dev/
# ta se uloží do proměnné $DEVICE
# ********
# TODO:
# přidat ještě přepínač na automatické přidání disku do databáze
# a určitě to poladit

hlaska () {
  cat <<HLASKA
  Musí být spuštěno s root právy!
  Skript přijímá jen jeden parametr a to adresu za /dev/
  Např.:
  sudo $0 sda
  Pak vyplivne údaje pro pozdější zpracování skriptu pro conky.
  Type disku, ID teploty, u nvme disků správnou adresu hwmon.
  A identifikátor pro udev.
HLASKA
}

DEVICE=$1

case $DEVICE in
  -h) hlaska
  exit 0
  ;;
  --help) hlaska
  exit 0
  ;;
esac

# připravý se řetězec s příkazem na detekci disku
# string se zřetězí s obsahem proměnné $device
typetest='smartctl --json=g -d test /dev/'$DEVICE

# test návratové hodnoty
if ! $typetest 1> /dev/null ; then
  # chyba bad device
  # přesměrování chybové hlášky na standardní chybový výstup
  hlaska > /dev/stderr
  # v tomto případě musí být návratová hodnota nenulová
  exit 1
fi

# vyseparování typu disku
# najde se první řádek obsahující slovo type
# a cutem se vyseká řetězec označující typ disku
# TYPE=`$typetest | tail -n 1 | grep -m 1 "type" | cut -d "'" -f 2`
TYPE=`$typetest | grep 'json.device.type' | cut -d '"' -f 2`

# test na type nvme
if [[ $TYPE == nvme ]]; then
  # vyhledá se adresa hwmonu
  HWMON_ADRESA=`ls "/sys/class/nvme/"${DEVICE::5}"/device/hwmon"`
  # vyhledávaný řetězec pro UDEV
  # UDEV="ATTR{serial}"
  # řetězec o adrese hwmon
  HWMON_ADRESA='hwmon "adresa": '$HWMON_ADRESA
fi

# negovaný test návratové hodnoty příkazu zjištění ID
# využijem vlastnosti kdy je návratová hodnota testovaná zvlášť
# od výstupu příkazu. Ten ať je jakýkoliv se zapíše (jen první
# slovo!!!) do proměnné $IDECKO. Buď je to správný údaj nebo něco náhodného.
# Proběhne test návratové hodnoty. Když je nenulová přepíše se
# údaj v proměnné $IDECKO. Když je vše v pořádku (ticho na stderr)
# zůstane správný údaj v $IDECKO. Test proběhne pomocí regulárního výrazu na
# hodnotu 190 nebo 194 na začátku řádku
#if ! IDECKO=(`smartctl -A -d $TYPE /dev/$DEVICE | grep -E '^19?[04]'`); then
  # Ajajaj máme nějaký exotický kousek
  # IDECKO="neznámé"
#fi

# Předcházející řešení se mi moc nelíbí, protože nechápu proč se zapíše jen
# první slovo výsledku grepu do proměnné. Může to být náhodné
# chování/neznalost a tomu je lepší předejít vytvořením jiné konstrukce.

# Uloží se příkazy do proměnné $OO Je to takový hloupý hook, ale jinak to nejde.
OO=`smartctl -A -d $TYPE /dev/$DEVICE | grep -E '^19?[04]' | cut -d " " -f 1`

# A tady proběhne test výsledku. Pokud je nulový do proměnné $IDECKO se uloží
# řetězec "neznámé". Pokud je nenulový, jeho výsledek se uloží do $IDECKO
# Taková obdoba ternálního operátoru
IDECKO=${OO:="neznámé"}

# poupravení kvůli přehlednosti výstupu
IDECKO='ID teploty: '$IDECKO

# Do proměnné $HWMON se vloží hodnota HWMON_ADRESA pokud je nastavená, jinak $IDECKO
HWMON=${HWMON_ADRESA:=$IDECKO}

# pokud není UDEV řetězec nastaven, nastavíme ho
# UDEV=${UDEV:="ATTRS{model}"}
UDEV="ATTRS{model}"

cat <<END_VYPIS
**************************************************************************************
disk: /dev/$DEVICE
Typ smartctl: $TYPE
$HWMON
**************************************************************************************
Řádek do konfiguračního souboru:
$TYPE |  `udevadm info --query all --attribute-walk --path $(udevadm info -q path -n /dev/$DEVICE) | grep -m 1 $UDEV | tr -d ' ' | tr -d '\t'` | $OO

END_VYPIS

# `smartctl -A --json=g -d $TYPE /dev/$DEVICE`
# pošlem disk spinkat
hdparm -y /dev/$DEVICE

Dále vytvořit /usr/local/sbin/conktemp.sh s tímto obsahem:
Kód: [Vybrat]
#! /usr/bin/env bash


# *******************************************************
# *******************************************************
# Následující proměnné je možné (beztrestně) měnit

# adresa souboru s databází disků
CONF_DISC_FILE='/etc/conky/my_conf.conf'

# interval čtení v sekundách
UPDATE_INTERVAL=5

# symbol pokud je disk ve standby módu
STANDBY_ON="×"

# symbol znázorňující aktivní disk
STANDBY_OFF="↑"

# Zde končí beztrestnost
# *******************************************************
# *******************************************************


# ######################################################
# POZNÁMKY
# pro sda:
# smartctl -l scttempsts --json=g -d sat /dev/sd*
# pro nvme:
# smartctl -A --json=g -d nvme /dev/nvme0*
# ######################################################


# Zde jsou lvi:

# **************************
projdi_db () {

  # pomocná proměnná na detekci neznámého disku
  UNBEKANNT=

  # načtení konfiguračního souboru řádek po řádku
  # každý řádek bude rozdělen na tři pole:
  # TYPE | ATTR | TEMP_ID
  # rozdělení se provede podle přiřazeného delimiteru IFS
  while IFS=\| read -r TYPE ATTR TEMP_ID; do
   
    # vymazání všech mezer a tabů v proměnné pomocí expanze
    # ať se dá pracovat s čistou hodnotou
    TYPE=${TYPE//" "/""}; TYPE=${TYPE//$'\t'/""}
   
    # vymazání všech mezer a tabů v proměnné pomocí expanze
    # ať se dá pracovat s čistou hodnotou
    ATTR=${ATTR//" "/""}; ATTR=${ATTR//$'\t'/""}
   
    # vymazání všech mezer a tabů v proměnné pomocí expanze
    # ať se dá pracovat s čistou hodnotou
    TEMP_ID=${TEMP_ID//" "/""}; TEMP_ID=${TEMP_ID//$'\t'/""}
   
    # test na komentář, první pole(řádek) začíná znakem #
    # pokud ano, přeskoč to
    [[ $TYPE = \#* ]] && continue
   
    # úplně prázdný (beze znaků) řádek taky přeskoč
    [[ -z $TYPE ]] && continue
   
    # vyloučím nvme disky (asi zatím)
    # [[ $TYPE = \nvme ]] && continue
   
    # řádek je platný, pole byla přiřazena do
    # jednotlivých proměnných a je možno s nima pracovat dále
    if [[ "$UDEV_ATTR" = "$ATTR" ]]; then
      # odskok na zpracovávající funkci
      # rozkouskování kódu kvůli lepší editaci a modulárnosti
      elem_vypis

      # Zde se vypisuje teplota a stav disku
      VYSTUP="$VYSTUP$ADR_DEV: $TEPLOTA | "

      # vymazání proměnných
      STANDBY=
      TEPLOTA=

      # disk je rozpoznán
      UNBEKANNT="nein"
    fi

  # načti konfigurační soubor
  done < "$CONF_DISC_FILE"

  # celá databáze se porovnala s aktuálně načteným diskem
  # pokud nebyl disk zadán v databázi přidej na výstup upozornění
  [[ ! "$UNBEKANNT" ]] && VYSTUP="$VYSTUP $ADR_DEV: neznámý disk"
}


# **************************
# řídící funkce podle typu disku
elem_vypis () {
  case "$TYPE" in
    nvme) nvme_vypis;;
    sat) sata_vypis;;
    *) TEPLOTA="neznámý type";;
  esac
}

# **************************
# funkce zpracovávající výstup ze SATA rozhraní
sata_vypis () {
      # načítání údaje o teplotě a standby disku ze SMARTu bez probouzení disku
      TEPLOTA=`smartctl -l scttempsts --json=g -d $TYPE $RU | grep 'json.temperature.current' | cut -d '=' -f 2`
      STANDBY=`smartctl -l scttempsts --json=g -d $TYPE $RU | grep 'status.device_state.string' | awk '{print $3}'`
      # úprava hodnoty
      TEPLOTA=${TEPLOTA//';'/'°C '}
      TEPLOTA=${TEPLOTA//' '/''}

      # přiřazení znaku standby
      if [[ "$STANDBY" = '"Stand-by";' ]]; then
        STANDBY="$STANDBY_ON"
        else
        STANDBY="$STANDBY_OFF"
      fi

      # "výstup" z funkce
      TEPLOTA="$TEPLOTA$STANDBY"
}

# **************************
# funkce zpracovávající nvme teplotu čtením ze systémového souboru
nvme_vypis () {

  # podle standardu musí být aktuální teplota v souboru `temp1_input`
  # vyseparuje se dle adresy zařízení
  # další standard uvádí řazení a značení disků nvme
  # první disk je nvme0 další nvme1 atd.
  # pak následuje písmeno "n" a za ním jednotlivé partition
  # Ještě musím prostudovat celou logiku nvme disků, ale první partition se
  # prolíná/je částečně totožná s kořenem. Tzn. nvme0n1 je skoro totožné s nvme0
  TEPLOTA=`cat /sys/class/nvme/"${ADR_DEV::5}"/device/hwmon/*/temp1_input`

  # teplota má být vždy v tisícinách stupňů celsia
  # tak se oříznou poslední tři znaky a máme to ;D
  TEPLOTA="${TEPLOTA%%???}°C"
}


# *****************************************************************
# Hlavní loop
# *****************************************************************

while true; do

  # načtení připojených disků
  # DEVICES=`lsblk -dnp -o NAME`
  DEVICES=`lsblk -po NAME,TYPE | grep disk | awk {'print $1'}`
  VYSTUP=

  # procházení jednotlivými disky
  for RU in $DEVICES; do
   
    # není to zrovna moc košer, ale na lepší způsob
    # určení disku jsem nepřišel
    ADR_DEV=`echo "$RU" | awk -F '/' '{print $3}'`
   
    # načtení modelu aktuálního disku
    UDEV_ATTR=`udevadm info --query all --attribute-walk --path $(udevadm info -q path -n $RU) | grep -m 1 'ATTRS{model}'`
   
    # pomocí expanze se vykuchají mezery a tabulátory
    UDEV_ATTR=${UDEV_ATTR//' '/''}
    UDEV_ATTR=${UDEV_ATTR//$'\t'/''}
   
    # zavolá se funkce porovnávající aktuální údaj s databází
    # není třeba předávat parametry protože v rámci jednoho
    # shelu/skriptu jsou proměnné globální
    projdi_db
  done;

  # zde se vypisuje kompletní výstup
  echo "$VYSTUP" > /tmp/conky_honky_tonky
  sleep "$UPDATE_INTERVAL"
done

Oběma souborům je třeba nastavit práva:
Kód: [Vybrat]
cd /usr/local/sbin/
sudo chown root:root conkys.sh
sudo chown root:root conktemp.sh
sudo chmod +x *

A pak vytvořit soubor v /etc/conky/my_conf.conf s tímto:
Kód: [Vybrat]
# Privátní databáze disků připojovaných k systému.
# Řádek začínající znakem hash je považován za komentář a bude ignorován.
# Jako delimiter je použit znak roury |
# Každý řádek musí být ve tvaru:
# TYPE disku | UDEV identifikátor | ID teploty
# _______________________________________________________________________
# sat | ATTRS{model}=="HTS545050B9A300 " | 194
# _______________________________________________________________________
# U nvme disků se třetí údaj neudává (nemají ho)
     

sat | ATTRS{model}=="HTS545050B9A300 " | 194
nvme |    ATTRS{model}=="SKHynix_HFM512GDHTNI-87A0 B "   |

Pak ještě jako root vytvořit /usr/lib/systemd/system/conktemp.service obsahující:
Kód: [Vybrat]
################################################################################
# conktemp.service
#
################################################################################

[Unit]

Description=Spouštění skriptu na čtení teplot do conky

 
[Service]

ExecStart=-/usr/local/sbin/conktemp.sh
ExecStopPost=-/usr/bin/rm -f /tmp/conky_honky_tonky

[Install]

WantedBy=graphical.target
Tím si připravíme pro systemd konfigurační soubor naší služby. Poté spustitíme registraci služby. Od teď se bude vždy po startu systému sama spouštět. Dalším řádkem si ji spustíme hned.
Kód: [Vybrat]
sudo systemctl enable /usr/lib/systemd/system/conktemp.service
sudo systemctl start conktemp.service

Vše si hodně okomentovávám, takže byse v tom snad neměl nikdo ztratit.
Pointa je taková, že si conky žije svým životem a jen zobrazuje jeden řádek ze souboru v dočasném adresáři /tmp/conky_honky_tonky. Takže minimální režie. Dále tu máme soubor /etc/conky/my_conf.conf. To je databáze našich disků. Každý si ji upraví podle sebe tím že spustí
Kód: [Vybrat]
sudo conkys.sh vas_disk
kde vas_disk je disk který je připojen a chcete ho detekovat. Píše se bez cesty, jen název za dev třeba sda. Skript vyplivne údaj který si růčo nakopírujete a přidáte jako další řádek na konec souboru /etc/conky/my_conf.conf a pak disk uspí. Vlastně tady tím bych začal. Takto si nadetekujte všechny disky co si připojujete (nemusí to být hned a najednou). Jednodušší to bude pomocí příkazu
Kód: [Vybrat]
lsblk -dnp -o NAME
Hlavní skript spouštěný pomocí systemd čte informace o připojených discích v intervalu který se dá měnit. Pokaždé porovná díky udevu info o disku s databází a načte teplotu bez jeho probuzení! Přirom detekuje či disk spí nebo ne a vypíše to pomocí symbolu (dají se měnit). Skript vypisuje i teploty nvme disků díky hwmon. Program nepoužívá hddtemp protože neumí načítat hodnoty bez roztáčení disků a tím se opotřebovávají. Dělá to ikdyž běží jako daemon. A dělá to i smartctl přez exec* ve všech řešeních co jsem na netu našel. Disky se můžou připojovat a odpojovat bez přeregistrace, bez restartu atd. Přidávat nebo mazat z databáze se také může za běhu.

Na lepší řešení jsem zatím nepřišel a ani ho nikde nenašel. Chyby které se určitě vyskytnou mě hlašte a pokusím se je odstranit. Bohužel toho hardware nemám tolik abych mohl odzkoušet všechny možnosti. Tak se to bude muset řešit za vaší vydatné pomoci. Nejsem programátor (je to jen můj občasný koníček) tak uvítám připomínky a rady jak to udělat lépe.
EDIT:
Změněn řádek 154 v souboru conktemp.sh kvůli vyloučení detekce snapu a CD mechanik
« Poslední změna: 14 Června 2022, 23:54:20 od ramael »
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

Ventero

  • Závislák
  • ***
  • Příspěvků: 3549
Re:Conky [Vyřešeno]
« Odpověď #134 kdy: 14 Června 2022, 00:06:11 »
Sleduji tohle vlákno od začátku a chlape ty jsi génius.

Jenom mě zase děsí, jak je taková celkem banální věc neskutečně složitá - na tohle nemá normální smrtelník čas, nervy nebo trpělivost ani s Tvou a Juwovo pomocí ...

 ... co se prostě s tou koncepcí Linuxu děje? - už to tady padlo, že to je komplikovanější na nejspíše vrub systemd ...
Zvuky jsou mantrami a myšlenky moudrostí, prostě proto, že se mohou objevovat ...

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #135 kdy: 14 Června 2022, 07:26:54 »
Bych to nepřeháněl. Je to jen obalený příkaz do skriptu. Vlastně mě na to navedl juwa2. Jeho řešení sudo smartctl -l scttemp -d sat /dev/sdc u mne vyhodí velice dlouhý výpis. Což by podle manuálové stránky mělo udělat u každého. Ale přepínač scttempsts je už o něčem jiném  8) Já chtěl původně testovat jestli disk spí a pokud ano, tak brát teplotu z vlastní chache a upozornit na to nějakým znakem. To mělo používat hddtemp v daemon režimu a pořád ho podle potřeb restartovat přez systemd. Další restarty by byli díky udev pravidel. A co by šlo to si cucat v conky z hwmonu...
To byla původní koncepce. Což je vidět i ve skriptu a databázi. Je tam ten údaj ID který je vlastně už nepotřebný (zatím). Díky přepínači --json=b se celý výstup krásně unifikuje a tím i skvěle parsuje.
Velká čest tvůrcům smartmontools!
Testy využívající klasickou cestu které jsem zveřejnil před pár dny:
Citace
strace má zvláštnost, že jeho výstup posílá na standardní chybový výstup. Proto jsem musel použít 2>. U smartctl jsem ještě navíc (v jeho neprospěch) použil grep ^194 aby byl výstup také jednořádkový. 194 je SMART ID teploty tohoto disku.
Výsledek vezmu od zadu.
time  HDSentinel ("roztočený" disk):
real   0m0,505s
user   0m0,000s
sys   0m0,009s

time HDSentinel (uspaný disk):
real   0m2,386s
user   0m0,000s
sys   0m0,009s

time smartctl (roztočený disk):
real   0m0,338s
user   0m0,017s
sys   0m0,005s

time smartctl (uspaný disk):
real   0m2,240s
user   0m0,016s
sys   0m0,007s

smartctl ještě na víc s grepem je rychlejší!

velikost výstupu strace (přehled kollik to spotřebuje systémových prostředků):
HDSentinel:
du -b hdsen1.txt
23198   hdsen1.txt

smartctl:
du -b smart1.txt
20350   smart1.txt

A nový test na nynější řešení:
Citace
sudo time smartctl -l scttempsts --json=g -d sat /dev/sda (uspaný disk):
real   0m0,032s
user   0m0,022s
sys   0m0,004s

A běžící disk:
real   0m0,028s
user   0m0,014s
sys   0m0,011s

du -b s.txt
17463   s.txt
Je to 12X rychlejší než klasika s roztočeným diskem. A 70X oproti spícímu disku. Velikost výstupu (spotřeba systémových prostředků) klesla o víc než 10% Samotného mne to překvapilo. Něco si vezme režie vlastního skriptu. Ale i tak si myslím, že je to zatím nejmíň systémově náročné řešení. Je možné, že to na některých discích fungovat nebude. Pokud to někomu nebude fungovat ze stejného důvodu jako na PC mé ženy, tak tam podporu starší verze smartmontools dopíšu.
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

juwa2

  • Závislák
  • ***
  • Příspěvků: 4936
Re:Conky [Vyřešeno]
« Odpověď #136 kdy: 14 Června 2022, 08:35:21 »
Tak jsem to chtěl vyzkoušet, ale napadlo mě se podívat jakou mám verzi smartmontools. V U18.04 mám v 6.5  :-[
Nicméně existuje jeden backport PPA kde je v 7.3 (je tam i pro xenial, takže můžeš doinstalovat manželce...)

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #137 kdy: 14 Června 2022, 09:13:50 »
Myslím, že to neudělám. Ona conky nepoužívá. Nainstaloval jsem to tam jen kvůli testování. Spouštím to tam z terminálu a po testech použiju ctrl+c. Když to u ní povýším nebudu moc testovat. Ještě se ve skriptu najde pár zakomentovaných řádků na původní verzi bez json. Ale připadalo mě to takové těžkopádné a narazil jsem na pár problémů ohledně detekce disků. Třeba, že disk se detekuje jako scsi jednotka, ale smartctl nakonec na něj použije rozhraní sat a funguje to. Jenže ten výpis není dobře bez instalace dodatečných nástrojů parsovatelný. Tak jsem nakonec použil ten json který to sdělí čistě a jasně. Ale to už jsem dodělal na laptopu. Až zpětně jsem zjistil,že u ní díky starší verzi smartmontools ten json nefunguje. Na mém laptopu conky nejede protože wayland. A ikdybych měl Xka, díky i3 a jeho liště bych se k conky stejně nevrátil. Conky jsem používal na starém laptopu kde jsem měl PekWM a ten nemá info lištu.
Snad to nevyznělo že mám něco proti conky. Jen osobně preferuju spartánskou plochu a fakt minimum rušivých informací. Třeba tady je můj prvotní výtvor https://github.com/RadekRojik/minilista který zobrazuje pro mne dostačující informace o systému.

EDIT:
Zkusím to dopsat i pro verzi bez json. Chvíli to bude trvat...
« Poslední změna: 14 Června 2022, 09:15:37 od ramael »
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #138 kdy: 14 Června 2022, 09:19:25 »
Tak jsem to chtěl vyzkoušet, ale napadlo mě se podívat jakou mám verzi smartmontools. V U18.04 mám v 6.5  :-[
Nicméně existuje jeden backport PPA kde je v 7.3 (je tam i pro xenial, takže můžeš doinstalovat manželce...)
Moc nechápu proč tam máš starší verzi 6.5 než je u mojí ženy 6.6. Ona má U16.04 nebo možná ještě U14 Kouknu se až se vrátím domu jakou. A ty máš už U18.04.
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

juwa2

  • Závislák
  • ***
  • Příspěvků: 4936
Re:Conky [Vyřešeno]
« Odpověď #139 kdy: 14 Června 2022, 10:14:16 »
Ono je rozdíl, zda se jedná o verzi smartmontools nebo smartctl - nemusí být stejné (smartctl je jednou ze součástí).

Ale už tu mám první výsledek (v conky mě vyděsil - měl jsem conky přes celou Plochu). Z nějakého důvodu se detekují úplně všechny jednotky (i loop, mechaniky atd.).
Zde je obsah souboru /tmp/conky_honky_tonky
Kód: [Vybrat]
loop0: neznámý disk loop1: neznámý disk loop2: neznámý disk loop3: neznámý disk loop4: neznámý disk loop5: neznámý disk loop6: neznámý disk loop7: neznámý disk loop8: neznámý disk loop9: neznámý disk loop10: neznámý disk loop11: neznámý disk loop12: neznámý disksda: 46°C↑ | sdb: 39°C↑ | sdc: 37°C↑ | sdd: 29°C× |  sr0: neznámý disk
Jinak ty teploty (sda sdb sdc sdd) se načítají správně, disky se nebudí (tedy netočí se, nicméně kontrolka každých 5s blikne - je vidět, že na disk "něco sahá".
Asi by ten výstup chtělo nějak vyfiltrovat. Nebo skript nastavit aby si určitých disků nevšímal...
EDIT: V skriptu conktemp.sh stačí v hlavním loopu > načtení připojených disků změnit řádek 154:
Kód: [Vybrat]
DEVICES=`lsblk -dnp -o NAME | grep /dev/sd`
Tím se vyfiltruje vše kromě /dev/sdX
Aby se změna projevila, je třeba restartovat tu službu:
Kód: [Vybrat]
sudo systemctl restart conktemp.service

Potom soubor /tmp/conky_honky_tonky  vypadá takto:
Kód: [Vybrat]
sda: 46°C↑ | sdb: 40°C↑ | sdc: 36°C↑ | sdd: 29°C× |
A conky pochopitelně "ukazuje správně".  ;)
« Poslední změna: 14 Června 2022, 11:45:36 od juwa2 »

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #140 kdy: 14 Června 2022, 12:15:31 »
Dík za zpětnou vazbu. O to které disky to načítá se stará v conktemp.sh 154. řádek
Konkrétně příkaz lsblk -dnp -o NAME kde přepínače
d  má zajistit výstup jen fyzických disků. Bez partittion.
n  bez hlavičky/návěstí
p  výpis plné cesty
o NAME  vypíše jen sloupec s udanými názvy. V tomto případě NAME
Nemělo by to vypsat loopy
copak Ti to vypíše?:
Kód: [Vybrat]
sudo lsblk -dnp -o NAME
Popřípadě ještě
Kód: [Vybrat]
bash --version

EDIT:
Jsme psali přes sebe :D
« Poslední změna: 14 Června 2022, 12:19:23 od ramael »
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #141 kdy: 14 Června 2022, 12:28:44 »
Ono je rozdíl, zda se jedná o verzi smartmontools nebo smartctl - nemusí být stejné (smartctl je jednou ze součástí).

Ale už tu mám první výsledek (v conky mě vyděsil - měl jsem conky přes celou Plochu). Z nějakého důvodu se detekují úplně všechny jednotky (i loop, mechaniky atd.).
Zde je obsah souboru /tmp/conky_honky_tonky
Kód: [Vybrat]
loop0: neznámý disk loop1: neznámý disk loop2: neznámý disk loop3: neznámý disk loop4: neznámý disk loop5: neznámý disk loop6: neznámý disk loop7: neznámý disk loop8: neznámý disk loop9: neznámý disk loop10: neznámý disk loop11: neznámý disk loop12: neznámý disksda: 46°C↑ | sdb: 39°C↑ | sdc: 37°C↑ | sdd: 29°C× |  sr0: neznámý disk
Jinak ty teploty (sda sdb sdc sdd) se načítají správně, disky se nebudí (tedy netočí se, nicméně kontrolka každých 5s blikne - je vidět, že na disk "něco sahá".
Asi by ten výstup chtělo nějak vyfiltrovat. Nebo skript nastavit aby si určitých disků nevšímal...
EDIT: V skriptu conktemp.sh stačí v hlavním loopu > načtení připojených disků změnit řádek 154:
Kód: [Vybrat]
DEVICES=`lsblk -dnp -o NAME | grep /dev/sd`
Tím se vyfiltruje vše kromě /dev/sdX
Aby se změna projevila, je třeba restartovat tu službu:
Kód: [Vybrat]
sudo systemctl restart conktemp.service

Potom soubor /tmp/conky_honky_tonky  vypadá takto:
Kód: [Vybrat]
sda: 46°C↑ | sdb: 40°C↑ | sdc: 36°C↑ | sdd: 29°C× |
A conky pochopitelně "ukazuje správně".  ;)
Není to nejuniverzálnější řešení. Protože pokud budou disky jinak nazvány, třeba nvme. Tak se nezobrazí.
Jaký máš výstup z
Kód: [Vybrat]
sudo lsblk -dnp -o NAME
sudo lsblk
To blikání je dáno aktivitou chipu na disku. smartctl se zeptá chipu jen na jeho log jestli jsem to dobře pochopil. Což by nemělo být nic proti ničemu.
« Poslední změna: 14 Června 2022, 13:01:05 od ramael »
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

juwa2

  • Závislák
  • ***
  • Příspěvků: 4936
Re:Conky [Vyřešeno]
« Odpověď #142 kdy: 14 Června 2022, 13:15:49 »
Kód: [Vybrat]
juwa@p-5738:~$ sudo lsblk -dnp -o NAME
[sudo] heslo pro juwa:         
/dev/loop0
/dev/loop1
/dev/loop2
/dev/loop3
/dev/loop4
/dev/loop5
/dev/loop6
/dev/loop7
/dev/loop8
/dev/loop9
/dev/loop10
/dev/loop11
/dev/loop12
/dev/sda
/dev/sdb
/dev/sdc
/dev/sdd
/dev/sr0
juwa@p-5738:~$ sudo lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 113,9M  1 loop /snap/core/13308
loop1    7:1    0     4K  1 loop /snap/bare/5
loop2    7:2    0  81,3M  1 loop /snap/gtk-common-themes/1534
loop3    7:3    0  61,9M  1 loop /snap/core20/1518
loop4    7:4    0  55,5M  1 loop /snap/core18/2409
loop5    7:5    0 346,9M  1 loop /snap/wine-platform-runtime/302
loop6    7:6    0  13,5M  1 loop /snap/ubuntu-mate-welcome/709
loop7    7:7    0 164,8M  1 loop /snap/gnome-3-28-1804/161
loop8    7:8    0   9,3M  1 loop /snap/foobar2000/431
loop9    7:9    0   140K  1 loop /snap/gtk2-common-themes/13
loop10   7:10   0  17,9M  1 loop /snap/pdftk/9
loop11   7:11   0 101,5M  1 loop /snap/p7zip-desktop/220
loop12   7:12   0   323M  1 loop /snap/wine-platform-6-stable/19
sda      8:0    0 465,8G  0 disk
├─sda1   8:1    0 373,8G  0 part /mnt/film2
├─sda3   8:3    0     4G  0 part [SWAP]
├─sda5   8:5    0    38G  0 part /run/timeshift/backup
└─sda6   8:6    0    50G  0 part /home
sdb      8:16   0 931,5G  0 disk
├─sdb1   8:17   0 115,1G  0 part /media/juwa/REPO
├─sdb5   8:21   0 644,3G  0 part
└─sdb6   8:22   0 172,1G  0 part /mnt/651e76ac-0f63-48bc-93ff-de811417bbed
sdc      8:32   0   1,8T  0 disk
└─sdc1   8:33   0   1,8T  0 part
sdd      8:48   0 931,5G  0 disk
└─sdd1   8:49   0 931,5G  0 part
sr0     11:0    1  1024M  0 rom 

O ty názvy bych si starosti nedělal, to je to poslední...
Mám ale dojem, že mi to vytěžuje CPU a to jsem prodloužil ten interval na minutu. Ale i tak mám v klidu (nic jiného nejede) cca 10%
Předtím to byla sotva polovina...
Zkusím to ještě prozkoumat (a restartovat).

EDIT: Po odpojení všech ext. disků a násl. restartu vytížení CPU zmizelo, připojeno 6 disků, teploty se krásně zobrazují, už to vypadalo nadějně...
Bohužel disky se neuspí, jedou "furt pryč". Vždycky v tom intervalu dostanou "impuls" (je to i slyšet jako takové cuknutí) a ten jim zabrání ve spánku.

Službu jsem tedy zastavil a disky do 10 min. spaly. Takže bohužel - ale jako cvičení to bylo hezké.... :)
Ve windowsech se disky uspávají a teplota se přesto ukazuje. Jak to jenom dělají - mám silné nutkání spustit CrystalDiskInfo  ve wine, kdyby to fungovalo, to by byla ostuda. Asi to fakt vyzkouším... :-\
« Poslední změna: 14 Června 2022, 14:22:14 od juwa2 »

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #143 kdy: 14 Června 2022, 19:48:55 »
Je to celý divný. Mě se uspí úplně normálně. Možná mám štěstí na disky. Jeden už jsem vrátil, tak teď mohu experimentovat jen s jedním. Přepsal jsem ten 154. řádek na
Kód: [Vybrat]
DEVICES=`lsblk -po NAME,TYPE | grep disk | awk {'print $1'}`
Tím se vyfiltrují jen pevné/fyzické disky.
Jinak teď jsem to odzkoušel jak na dcery PC tak na ještě jednom netbooku https://www.samsung.com/cz/support/model/NP-N145-JP01CZ/ a fachá to bez vytížení systému. Zastav si conky. Zkus si uspat nějaký disk třeba
Kód: [Vybrat]
sudo hdparm -y /dev/sdd
Pusť si top. Chvíli, třeba 5 minut počkej jestli ho něco nevzbudí. A když ne, tak si růčo spusť sudo conktemp.sh. Nebude to nic psát, protože loop. V druhém terminálu se občas koukni na výsledek pomocí
Kód: [Vybrat]
cat /tmp/conky_honky_tonky
Jestli to neprobudí disk, tak je problém jinde. Občas koukni na top. Možná to bude chtít prostudovat kompletně co je to za disk a pak znova "man smartctl" a třeba se najde lepší řešení. Je třeba toho hodně zkusit aby se našlo co zlobí.

Odbočka od tématu
Jestli musíš mít ten snap tak ok. Avšak mě to vytěžovalo setsakramentsky systém a síť. Dokonce se spousta věcí chovala dost nestandardně. Řekl bych, že je to ještě větší zlo než systemd. A tak po každé instalaci nového systému provedu něco takového:
Kód: [Vybrat]
snap list
sudo snap remove #co ukázalo předchozí
sudo unmount /snap/core/#všechny core co tam jsou
sudo apt purge snapd
rm -rf ~/snap
sudo rm -rf /snap
sudo rm -rf /var/snap
sudo rm -rf /var/lib/snapd
a svatý klid.
« Poslední změna: 14 Června 2022, 19:54:41 od ramael »
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

juwa2

  • Závislák
  • ***
  • Příspěvků: 4936
Re:Conky [Vyřešeno]
« Odpověď #144 kdy: 14 Června 2022, 21:10:07 »
Vytížení je vyřešeno, souviselo s něčím jiným (po instalaci nové verze smartmontools nebyl proveden restart).

Řádek 154 je OK

Pokud disk (disky) uspím ručně, samy se nevzbudí. Nicméně ve výpisu sudo hdparm -y /dev/sdx  je vždy nějaká chyba.
Pokud disky ručně neuspím, samy neusnou.
Už na to prdím, momentálně to pro mě není až tak důležité, šlo o princip. Jinak hlavně že teploty exteráků zobrazovat jdou, neuspávání je podružné. A pokud chci uspávat, holt zase nebudou teploty...

Snap rád nemám, nicméně si ho držím jako nouzovku, v některých ojedinělých případech není jiná možnost. Zbavit se ho přirozeně umím...

Jo, a ten CDI jsem zkoušel - spustit jde, ale disky nevidí.. ;)
Ale ve windows teplotu externích disků sleduje (foukal jsem fénem) a přitom je nebudí...
« Poslední změna: 15 Června 2022, 09:30:54 od juwa2 »

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #145 kdy: 15 Června 2022, 11:41:48 »
Se v těch zkratkách ztrácím. Co je CDI?
Strašně mě štve když věci nefungují jak mají. A ještě víc když dělám chyby. Půl noci vzhůru a nad ránem myšlenka. Tak se v tom nimrám. Mojí chybu mám na mysli, že jsem sem nedal testovací verzi conktemp.sh a hlavně si neuvědomil při testování, že jí mám jinou. Spouští se tam na začátku podshel hozený na pozadí, který mi testovací disk uspí abych nemusel čekat než to udělá sám.
(sleep 8m; smartctl -s standby,now -d sat /dev/sda)& No, co na to říct. Jsem (#$%&*)^²!!
Každopádně to byl posun vpřed tak i tak. Protože ostatní řešení aby byla teplota, ty disky vždy probudí. Toto řešení to neudělá, pokud disk spí. Jakmile se disk z jakéhokoliv důvodu rozběhne, tak už "nemá" šanci usnout. Ono je to ještě trošku složitější, rozlišuje se ještě sleep, standby a idle. Pro nás je žádoucí standby. Dá se nastavit a to fakt funfuje, že disk po vykonání jakékoliv činnosti přejde neprodleně do standby módu. Ale to je pro životnost disku také nic moc (pořád se rozbíhá a zastavuje). To už je lepší ho nechat běžet. Anebo ho nechat automaticky přepnout do standby po nějaké době nečinnosti.
A řekl bych, že tady vývojáři linuxu nejspíš zaspali:
Jádro vyřizuje diskové operace mimo jiné pomocí ioctl() Díky kterému proudí info mezi diskem a jádrem. A tady je i zakopaný pes. Jádro v tomto smyslu nemá žádný treshold Vnímá přesně buď nic, nebo aktivita a tím nepředá disku info teď po tobě nic nechci tak si "to udělej po svém". Avšak je tu nějaká možnost si to dodělat. Původně jsem chtěl načítat připojené disky ze souboru /proc/diskstats páč čím méně externích programů, tím lépe. Avšak jsem si to rozmyslel protože program lsblk je součástí core a tak musí být v systému pokaždé a není třeba ho doinstalovávat. Od výše zmiňovaného souboru už je jen krůček k informacím o prováděných a provedených operací na daném diskovém zařízení. Aby se nemusel číst celý soubor, který je souhrnem více dílčích souborů, dá se číst přesně co potřebujem ze stat souboru daného disku. Ty jsou mapovány v /sys/block/*/stat. Jsou to jaderné výstupy, takže stále aktuální a mají přesně daný formát: https://docs.kernel.org/admin-guide/iostats.html Napsal jsem pokusný skript na přečtení informací a proběhlých čtecích operací (ostatní operace jsou pro tento účel as nepotřebné) na disku:
Kód: [Vybrat]
#! /usr/bin/env bash

ktery_disk="sdc"
pocet_cyklu=10
cyklu=$pocet_cyklu
sekund_sleep_loop=1


# načtem kolik proběhlo operací read před našim testem
poc_sektoru=`cat /sys/block/$ktery_disk/stat | awk {'print $1'}`

# smyčka o zadaném počtu cyklů
while [ "$pocet_cyklu" -gt 0 ]; do

  # načtem teplotu z disku
  TEPLOTA=`sudo smartctl -l scttempsts --json=g -d sat /dev/$ktery_disk | grep 'json.temperature.current' | cut -d '=' -f 2`

  # vypisem teplotu
  echo ${TEPLOTA//';'/'°C'}
 
  # počkáme si ať nežerem procesorový čas
  sleep $sekund_sleep_loop

  # dekrementace cyklu
  pocet_cyklu=$(( $pocet_cyklu - 1 ))
done

# kolik readů po testu
kon_sektoru=`cat /sys/block/$ktery_disk/stat | awk {'print $1'}`

# rozdíl v počtu readů
rozdil=$(( $kon_sektoru - $poc_sektoru ))
echo "start sektoru: $poc_sektoru | end sektoru: $kon_sektoru | rozdíl: $rozdil"
echo "Jeden read = $(( $rozdil / $cyklu ))"
Testoval jsem to na disku ve standby módu. A pak na roztočeném bez jakýchkoliv jiných operací s diskem. A nakonec spustil ikdyž byl disk používán. Nastavoval jsem různé časové hodnoty $sekund_sleep_loop i počtu cyklů $pocet_cyklu. Vyšlo mi, že jedno čtení infa teploty dělá dva ready, pokud se disk nepoužívá. Zajímá mne kolik to dělá u vás?
Pokud to bude i u ostatních také tak, dalo by se to použít na zmiňovaný treshold. Počítalo byse kolikrát za nějaký časový úsek proběhlo čtení teploty. To vydělilo počtem readů a pokud by to bylo v tresholdu, dát disku povel na okamžitý přechod do standby módu. Jen jsem přesvědčen, že bash už na to bude krátký. Vidím to spíš na jazyk kde se dá vytvořit třída disk a od ní by vznikali instance jednotlivých připojených disků.

Je to dlouhý psaní také proto abych si to sám ujasnil. A aby mne někdo popřípadě poupravil v mých myšlenkových pochodech.

P.S.: taková blbost kvůli diskům kterých je čím dál méně :D
« Poslední změna: 15 Června 2022, 11:46:20 od ramael »
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #146 kdy: 16 Června 2022, 00:34:32 »
Tak jsem napsal první zkušební, ale fakt hodně zkušební skript v bash. On to ten bash dá i bez těch tříd. Tady je prvotina na vypisování teploty disku (jednoho) do terminálu.
disk_handle.sh :
Kód: [Vybrat]
#! /usr/bin/env bash


# $$ - vlastní pid

# #######################################################
# sichr je sichr
# přednastavíme defaultní hodnoty

# po jaké době se má uspat disk v sekundách
m_sleep='120'

# rychlost hlavního loopu v sekundách
m_loop='2'

# defaultní treshold
treshold='2'

NAS_READ='0'

# magické hodnoty mag_x a mag_y
# inspirace u autora conky na "doštelování" tresholdu
# podle vzorce treshold = treshold * mag_x + mag_y
mag_x='1'
mag_y='0'
# vzorec bude až za zpracováním argumentů

# později je třeba načítat z databáze !!!!
typ='sat'

# #######################################################
# argumenty a jejich pořadí
# první bude disk!
# doba na uspání disku v sekundách
# jak rychlý má být loop
# treshold

# test na přítonost parametru disku
m_disk=$1
if ! [[ $m_disk ]] ; then
  echo "chybí disk" > /dev/stderr
  exit 1
fi

# přiřazení argumentů. Pokud nejsou zadány nastavíme je do defaultu
m_sleep=${2-$m_sleep}
m_loop=${3-$m_loop}
treshold=${4-$treshold}

# magika doštelování
treshold=$(( $treshold * $mag_x + $mag_y ))

# #######################################################
# zde budou funkce

## pomocná funkce na výpis
hlaska () {
  cat <<LOG_HLASKA
  -----------------------------------------------
  teplota: $TEPLOTA°C
  stand: $STANDBY
  tre: $treshold
  poč * $pocatecni_cas
  akt * $(date +%s)
LOG_HLASKA
}


# #######################################################

# časové razítko
pocatecni_cas=$(date +%s)

# místo `true` dáme dvojtečku, ušetříme tím strojový čas
while :;do

  # načtem hodnotu read
  TR=$(cat /sys/block/$m_disk/stat | awk {'print $1'})

  if [ $STANDBY ]; then
    # disk nespííí

    if [ $(( $TR - $NAS_READ )) -ne $treshold ]; then
      # pokud jsme mimo treshold nastavujem časové razítko
      echo "startuji časové razítko disk nehajá"
      pocatecni_cas=$(date +%s)
    else
      # jsme v rámci tresholdu
      # porovnáme časové razítko s aktuálním časem
      if [ $(( $pocatecni_cas + $m_sleep )) -lt $(date +%s) ]; then
        # počátek s námi udaným časem aktivity je menší než aktuální čas
        # je čas jít spinkat
        sudo smartctl -s standby,now -d $typ /dev/$m_disk
      fi
    fi
  fi

  # načtem informace ze S.M.A.R.T.u disku
  SMART=$(sudo smartctl -l scttempsts -d $typ /dev/$m_disk)
  TEPLOTA=$(echo "$SMART" | grep -i 'current temperature' | cut -d ':' -f 2)
  STANDBY=$(echo "$SMART" | grep -i 'device state' | cut -d '(' -f 2)

  # vykuchání nežádoucích znaků díky expanzi regulárního výrazu
  TEPLOTA=${TEPLOTA//[a-zA-Z ]/''}
  STANDBY=${STANDBY//[)1]/''}

  NAS_READ=$TR
  hlaska
# reset proměnných
# STANDBY
sleep $m_loop
done
Zatím jsem to zkoušel jen na mém laptopu. Dopolčo zkusím ještě na dalších PC. Mělo by to jet i se starším smartmontools bez json. Skript stačí spustit jen s jedním argumentem a to systémovým názvem disku. Např.:
disk_handle.sh sdc Jako další nepovinný argument se dá přidat za jak dlouho se má disk přepnout do standby režimu. Argument musí být ve vteřinách (600 je deset minut :D ). Pokud se tento argument nezadá, přednastavil jsem jen dvě minuty aby to testování trochu "odsejpalo". Skript vypisuje pár údajů včetně teploty a stavů co jak momentálně je. Po zadané době se disk "uspí" a přesto bude dále vypisovat teplotu. Disk probuďte nějakou aktivitou a dokud se bude používat skript ho nechá jak je a bude psát pořád teplotu. Až se disk přestane používat, po zadané době opět "usne". Přivítám zprávy jak o funkčnosti tak opačného stavu.
P.S.: je to zatím přednastaveno na typ disku sat
Citace
Se v těch zkratkách ztrácím. Co je CDI?
už vím  ;)
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

ikx

  • Aktivní člen
  • *
  • Příspěvků: 476
Re:Conky [Vyřešeno]
« Odpověď #147 kdy: 16 Června 2022, 08:16:38 »
...mne teploty disku ukazuje aj PSENSOR... :o :o :o

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:Conky [Vyřešeno]
« Odpověď #148 kdy: 16 Června 2022, 08:52:55 »
Nemám čas na víc, ale když vidím tu snahu o efektivitu.. Každá roura vytváří nový subproces, ve kterém běží následující příkaz/program, takže je dobré zvážit, kdy má přínos. awk umí "grepovat" také a když nejde o dlouhé seznamy, kde je grep pro předfiltraci efektivnější, je dobré toho využít:
Kód: [Vybrat]
lsblk -po NAME,TYPE | awk '/disk/{print $1}'Zde je přínos malý, ale na tisíci opakováních to na mém deset let starém i5 nahoní necelých 200 ms.
sed je v tomto případě ještě o maličko rychlejší, než awk.
Kód: [Vybrat]
lsblk -po NAME,TYPE | sed -n '/disk/s@/\(.*/[^ ]\+\).*@\1@p'
Edit:
Ještě tohle třeba, bez zbytečných mezikroků:
Kód: [Vybrat]
TEPLOTA=$(echo "$SMART" | sed -n '/current temperature/Is/[^0-9]*\([0-9]\+\).*/\1/p')
TEPLOTA=$(echo "$SMART" | awk 'tolower($0) ~ /current temperature/{match($0, /[0-9]+/); print substr($0, RSTART, RLENGTH)}')
Mimochodem tady je třeba awk (přesněji mawk v Ubuntu) zásadně rychlejší, než sed a to cca 3,5x na mém systému.

Edit2:
Zrovna tak nedává smysl používat cat, když awk, sed, i grep umí číst ze souboru přímo:
Kód: [Vybrat]
cat /sys/block/$ktery_disk/stat | awk {'print $1'}
awk {'print $1'} /sys/block/$ktery_disk/stat
I když je fakt, že time mi rozdíl neukázal a cat s rourou mi vyprodukoval polovinu dat pro strace, než read přímo z awk, což mě doposud nenapadlo jako pravděpodobné.
« Poslední změna: 16 Června 2022, 15:02:07 od GdH »

ramael

  • Stálý člen
  • **
  • Příspěvků: 637
Re:Conky [Vyřešeno]
« Odpověď #149 kdy: 16 Června 2022, 16:11:18 »
Nemám čas na víc, ale když vidím tu snahu o efektivitu.. Každá roura vytváří nový subproces, ve kterém běží následující příkaz/program, takže je dobré zvážit, kdy má přínos. awk umí "grepovat" také a když nejde o dlouhé seznamy, kde je grep pro předfiltraci efektivnější, je dobré toho využít:
Kód: [Vybrat]
lsblk -po NAME,TYPE | awk '/disk/{print $1}'Zde je přínos malý, ale na tisíci opakováních to na mém deset let starém i5 nahoní necelých 200 ms.
sed je v tomto případě ještě o maličko rychlejší, než awk.
Kód: [Vybrat]
lsblk -po NAME,TYPE | sed -n '/disk/s@/\(.*/[^ ]\+\).*@\1@p'
Edit:
Ještě tohle třeba, bez zbytečných mezikroků:
Kód: [Vybrat]
TEPLOTA=$(echo "$SMART" | sed -n '/current temperature/Is/[^0-9]*\([0-9]\+\).*/\1/p')
TEPLOTA=$(echo "$SMART" | awk 'tolower($0) ~ /current temperature/{match($0, /[0-9]+/); print substr($0, RSTART, RLENGTH)}')
Mimochodem tady je třeba awk (přesněji mawk v Ubuntu) zásadně rychlejší, než sed a to cca 3,5x na mém systému.

Edit2:
Zrovna tak nedává smysl používat cat, když awk, sed, i grep umí číst ze souboru přímo:
Kód: [Vybrat]
cat /sys/block/$ktery_disk/stat | awk {'print $1'}
awk {'print $1'} /sys/block/$ktery_disk/stat
I když je fakt, že time mi rozdíl neukázal a cat s rourou mi vyprodukoval polovinu dat pro strace, než read přímo z awk, což mě doposud nenapadlo jako pravděpodobné.
JJ, dík za podměty. Už jsem to přepracoval. Nejdřív jsem se trápil s regulárními výrazy v sed. Nejsem v tom kovaný. A když už konečně to bylo jak jsem zamýšlel, tak mě time prozradil, že je lepší to číst rovnou z awk jak píšeš. Taky jsem si rozmyslel koncept. Je zbytečné aby skript ukazoval teplotu. Od toho už jsem napsal předchozí funkční věc. Tady jde o to uspávání disků po určité "neaktivitě". Tady je trochu "ostřejší" výsledek:
disk_handle.sh
Kód: [Vybrat]
#! /usr/bin/env bash

# *******************************************************
# skript má za úkol sledovat aktivitu na disku
# od poslední aktivity po nastaveném čase přepne disk
# do standby módu. Skript vyžaduje buď hdparm nebo smartctl
# smartctl (i starší verze) je rozumnější řešení. Lepší je skript
# spouštět s root právy. Nebo mít v .sudoers nastaveno bezheslové
# spouštění smartctl nebo hdparm
# zatím se skript spouští růčo:
# disk_handle.sh sdb &
# kde sdb je disk který chcete tímto způsobem "kontrolovat"
# pokud je někdo zvědavý ať si na konci skriptu odkomentuje
# tento řádek:
# echo $nespi
# mezi hvězdičkovými řádky
# pak se skript spustí bez posledního znaku &
# disk_handle.sh sdb
# alternativní spuštění: 
# disk_handle.sh sdb 900
# kde 900 je čas v sekundách za jak dlouho se má disk přepnout
#********************************************************

# #######################################################
# #######################################################
# Tady se dají vcelku bezproblémově nastavit různé
# parametry:


# po jaké době se má uspat disk v sekundách
m_sleep='600'

# rychlost hlavního loopu v sekundách
# čím vyšší číslo tím více šetříme CPU
# na úkor rychlosti odezvy
m_loop='2'

# defaultní treshold
treshold='2'

# #######################################################
# #######################################################
# a odtud už jen s velkou opatrností

NAS_READ='0'

# magické hodnoty mag_x a mag_y
# inspirace u autora conky na "doštelování" tresholdu
# podle vzorce treshold = treshold * mag_x + mag_y
mag_x='1'
mag_y='0'
# vzorec bude až za zpracováním argumentů

# později je třeba načítat z databáze !!!!
# typ='sat'

# #######################################################
# argumenty a jejich pořadí
# první bude disk!
# doba na uspání disku v sekundách
# jak rychlý má být loop
# treshold

# načtem název disku z prvního argumentu
m_disk=$1

# test jestli existuje soubor rotational
# pokud neexistuje, máme špatně zadaný disk nebo neexistuje
# když existuje jeho obsah předáme do proměnné rotation
# v opačném případě se skript ukončí s nenulovou návratovou hodnotou
rotation=$(cat /sys/block/$m_disk/queue/rotational) || exit 1

# pokud má předchozí výsledek hodnotu 0 disk by měl
# být bezplotnový a ukončíme to protože bezplotnové
# disky se neuspávají
# Zde se může vyskytnout problém. Třeba jedna prehistorická
# USB klíčenka (512MB = to bylo tenkrát dělo :D ) je registrována v
# systému jako plotnový disk. Nicméně smartctl ji nedokáže zpracovat
# a končí chybou
[[ $rotation -ne 0 ]] || exit 0

# pro hlavní funkci potřebujem smartctl nebo hdparm
# vytvoříme si vlastní konstrukt příkazu na uspávání
# teoreticky by smartctl měl v tomto případě fungovat bez
# určení typu - to se bude muset odzkoušet
uspavadlo=$( ((which smartctl) && echo ' -s standby,now ') || ((which hdparm) && echo ' -y ') ) || exit 1
kontrola_stavu=$( ((which smartctl) && echo ' -l scttempsts') || (( which hdparm) && echo ' -C') ) || exit 1

# přiřazení argumentů. Pokud nejsou zadány nastavíme je do defaultu
m_sleep=${2-$m_sleep}
m_loop=${3-$m_loop}
treshold=${4-$treshold}

# magika doštelování
# to tu není třeba
# treshold=$(( $treshold * $mag_x + $mag_y ))

# #######################################################
# zde budou funkce

## pomocná funkce na výpisy
hlaska () {
  cat <<LOG_HLASKA
  -----------------------------------------------
  teplota: $TEPLOTA°C
  stand: $STANDBY
  tre: $treshold
  poč * $pocatecni_cas
  akt * $(date +%s)
LOG_HLASKA
}


# #######################################################

# předregistrace časového razítka aby se disk neposlal hned spát
pocatecni_cas=$(date +%s)

# místo `true` dáme dvojtečku, ušetříme tím strojový čas
while :;do

  # načtem hodnotu read
  # jasně nejpomalejší:
  # TR=$(cat /sys/block/$m_disk/stat | awk {'print $1'})
  # time sed -n 's/ *//;s/ .*//p' /sys/block/sda/stat
  # je pomalejší a o drtek náročnější než toto:
  TR=$(awk {'print $1'} /sys/block/$m_disk/stat) || exit 0

# později proměnnou zakomentovat nebo vymazat
  nespi='Disk je ve standby módu'
# *************************

  # test jestli disk spí
  if [ "$STANDBY" ]; then
    # disk nespííí
# později proměnnou zakomentovat nebo vymazat
    nespi='Disk je aktivní'
# *************************

    if [ $(( $TR - $NAS_READ )) -gt $treshold ]; then
      # pokud jsme mimo treshold nastavujem časové razítko
# později proměnnou zakomentovat nebo vymazat
      nespi='startuji časové razítko od teď za $m_sleep sekund se přejde \
      do standby módu pokud se disk nebude používat'
# *************************
      pocatecni_cas=$(date +%s)
    else
      # jsme v rámci tresholdu
      # porovnáme časové razítko s aktuálním časem
      # if [ $(( $pocatecni_cas + $m_sleep )) -lt $(date +%s) ]; then
        # počátek s námi udaným časem aktivity je menší než aktuální čas
        # je čas jít spinkat
        # sudo smartctl -s standby,now -d $typ /dev/$m_disk
        # echo 'jdu spát'
        # sudo $uspavadlo /dev/$m_disk
        [ $(( $pocatecni_cas + $m_sleep )) -lt $(date +%s) ] && sudo $uspavadlo /dev/$m_disk
      # fi
    fi
  fi

  # Tohle vlastně není nutné! To by neměla být práce tohoto scriptu
  # načtem informace ze S.M.A.R.T.u disku
  # SMART=$(sudo smartctl -l scttempsts -d $typ /dev/$m_disk)
  # STANDBY=$(echo "$SMART" | grep -i 'device state' | cut -d '(' -f 2)
  # Tohle se mi nedaří lépe napsat aniž by to přestalo fungovat ;(
  STANDBY=`sudo $kontrola_stavu /dev/$m_disk | grep -i 'active'`

  # uložíme si starou hodnotu na pozdější porovnání
  NAS_READ=$TR
  # výpis stavů různých proměnných
  # hlaska

# ***********************************************************************
# Pro zvědavce odkomentovat na sledování průběhu:
# echo $nespi
# ***********************************************************************

# reset proměnných
# STANDBY
sleep $m_loop
done
V komentářích je napsáno co a jak. Pokud mne bude moci rodina večer postrádat, napíšu pravidlo pro udev.
Ten pak s každý připojeným diskem spustí toto na pozadí a hotovo. Skript jsem napsal tak aby se sám po odpojení disku ukončil.
Pak ještě zoptimalizuju skript na výpis hodnot pro conky.
Lenovo: ThinkPad X380 Yoga
Joutůůůůb

 

Provoz zaštiťuje spolek OpenAlt.