Автоматическая проверка S.M.A.R.T.

Обсуждение программ nnCron и nnCron LITE

Автоматическая проверка S.M.A.R.T.

Postby Morituruz » Wed, 31 Oct 2012, 18:22

Проверяем здоровье жёсткого диска. Если вдруг есть ошибки, выводим сообщение и хинт.
Можно отключить тревогу по выбранным битам (см. справку smartmontools или в коде цикл с определением ошибки по битам).
Code: Select all
<%
\ разрешение экрана
: xRes
GetDesktopSize DROP
;
: yRes
GetDesktopSize SWAP DROP
;
: mRes
GetDesktopSize + 2 /
;
: StringGetPos { a1 u1 a2 u2 -- pos}
a1 u1 a2 u2 SEARCH IF DROP a1 - 1+ ELSE 2DROP 0 THEN
;

%>

#( Check_HDD's_S.M.A.R.T.
\ 16:45 11.10.2012
\ Каждый день в 10 с чем-то часов
Time: ? 10 * * * *
RunMissed
NoLog
SingleInstance

CREATE smartctl_path 256 ALLOT
0 VALUE smart_verdict
1024 ALLOCATE THROW TO smart_verdict

: disk_letter ( a u -- a1 u1 )      \ буква диска
2DUP S" ;" StringGetPos ?DUP
IF      \ маска может быть не указана
   1 - MIN
THEN
;
: disabled_bitmask ( a u -- b )   \ маска отключенных битов
2DUP S" ;" StringGetPos ?DUP
IF      \ маска может быть не указана
   /STRING S>NUM
ELSE
   2DROP TRUE
THEN
;


: ** ( x y -- x^y ) \ возведение в степень:
1 SWAP 0 ?DO OVER * LOOP NIP
;
: print_bits ( x -- ) \ выводит на консоль биты, которые содержит x
1 -30 DO
   2 0 I - ** /MOD
   IF
      0 I - . CR
   THEN
LOOP
DROP
;
: bit_exist? { v b -- }
v 1 -30 DO
   2 0 I - ** /MOD
   IF
      0 I - b =
      IF
         DROP TRUE LEAVE
      THEN
   THEN
LOOP
?DUP NOT
IF
   FALSE
THEN
;

: run_smartctl { \ b -- }
\ принимает на вход строку с буквой диска (не логического, а физического!)
\ и отключенными битами
2DUP disabled_bitmask TO b
disk_letter \ кладём на стек букву диска из входной строки
"" smart_verdict ZPLACE
SWHide smartctl_path COUNT START-IN
START-APPW: cmd /c smartctl.exe -a /dev/hd%1 esPICKS% > smartctl_out
ExitCodeProc ?DUP
IF
   1 -8 DO
      \ делим код возврата на 2 в степени модуля I, чтобы узнать, какие биты ненулевые:
      2 0 I - ** /MOD
      IF
         b 0 I - bit_exist? NOT
         IF
            0 I - CASE
            0 OF
               " Command line did not parse.|n"
               smart_verdict +ZPLACE
            ENDOF
            1 OF
               " Device open failed, device did not return an IDENTIFY DEVICE structure, or device is in a low-power mode.|n"
               smart_verdict +ZPLACE
            ENDOF
            2 OF
               " Some SMART or other ATA command to the disk failed, or there was a checksum error in a SMART data structure.|n"
               smart_verdict +ZPLACE
            ENDOF
            3 OF
               " SMART status check returned «DISK FAILING».|n"
               smart_verdict +ZPLACE
            ENDOF
            4 OF
               " We found prefail Attributes <= threshold.|n"
               smart_verdict +ZPLACE
            ENDOF
            5 OF
               " SMART status check returned «DISK OK» but we found that some (usage or prefail) Attributes have been <= threshold at some time in the past.|n"
               smart_verdict +ZPLACE
            ENDOF
            6 OF
               " The device error log contains records of errors.|n"
               smart_verdict +ZPLACE
            ENDOF
            7 OF
               " The device self-test log contains records of errors. [ATA only] Failed self-tests outdated by a newer successful extended self-test are ignored.|n"
               smart_verdict +ZPLACE
            ENDOF
            DUP OF
               4096 16 + S" Check HDD's S.M.A.R.T." DROP
               " Unexpected bit: %0 I - N>S%" DROP 0 MessageBoxA DROP
               EXIT
            ENDCASE
         THEN
      THEN
   LOOP
   DROP
THEN
smartctl_path COUNT S" \smartctl_out" S+
2DUP
EXIST? \ файл существует?
IF
   FILE 2DUP
ELSE
   4096 16 + S" Check HDD's S.M.A.R.T." DROP
   " File |n%2SWAP%|n does not exist." DROP 0 MessageBoxA DROP
   EXIT
THEN
S" /Device\sModel:\s+([\w\d\s\-]+)\r\n.+SMART\ssupport\sis:\s.+SMART\ssupport\s\is:\s+(\w+)/si" RE-MATCH
IF
   \ смарт вообще включен?
   $2 S" Enabled" ICOMPARE 0=
   IF
      \ кладём на стек строку с моделью диска:
      " Hard disk %$1% is going to die:|n" 2SWAP
      S" /\r\n\s{0,3}\d{1,3}\s([\w\_]+)\s+0x[\da-f]{4}\s+\d+\s+\d+\s+\d+\s+Pre-fail\s+Always\s+([\w\_]+)/is"
      RE-ALL
         " %$1%    %$2%|n" S+
      ;RE-ALL
      \ по наличию 4 пробелов узнаём, приросла ли строка ошибками:
      2DUP S"     " StringGetPos
      IF
         \ тревога!
         mRes 10 / RANDOM 20 + DUP HINT-POS
         0x000000 0xFF0000 HINT-COLOR
         2DUP HINT CRLF S"  " StringReplace CRON-LOG
      ELSE
         2DROP
      THEN
   ELSE
      2DROP
      4096 16 + S" Check HDD's S.M.A.R.T." DROP
      " Hard disk |n%$1%|nS.M.A.R.T. disabled!" DROP 0 MessageBoxA DROP
   THEN
ELSE
      4096 16 + S" Check HDD's S.M.A.R.T." DROP
      S" Could not find matching strings" DROP 0 MessageBoxA DROP
THEN
smart_verdict ASCIIZ> NIP
IF
      4096 16 + S" Check HDD's S.M.A.R.T." DROP
      smart_verdict 0 MessageBoxA DROP
ELSE
   smartctl_path COUNT S" \smartctl_out" S+ FDELETE
THEN
;
Action:
\ Скачать последнюю версию:
\ http://sourceforge.net/projects/smartmontools/files/smartmontools/

\ получить список дисков:
\ smartctl.exe --scan

\ выяснить, включен ли S.M.A.R.T. у конкретного диска:
\ smartctl -i /dev/hda

\ папка в которую установлен smartctl.exe:
S" c:\Program Files\smartmontools\bin\" smartctl_path PLACE

\ буква жёсткого диска (не логического!) и исключающая маска:
S" a;64" run_smartctl
)#

Last edited by Morituruz on Wed, 31 Oct 2012, 21:47, edited 2 times in total.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Автоматическая проверка S.M.A.R.T.

Postby SeMa » Wed, 31 Oct 2012, 18:56

Определение add_task ???
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: Автоматическая проверка S.M.A.R.T.

Postby Morituruz » Wed, 31 Oct 2012, 21:48

Поправил.
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Автоматическая проверка S.M.A.R.T.

Postby mihast » Tue, 13 Nov 2012, 07:03

: run_smartctl { \ b -- }
\ принимает на вход строку с буквой диска (не логического, а физического!)
\ и отключенными битами
2DUP disabled_bitmask TO b
disk_letter \ кладём на стек букву диска из входной строки
"" smart_verdict ZPLACE
SWHide smartctl_path COUNT START-IN
START-APPW: cmd /c smartctl.exe -a /dev/hd%1 esPICKS% > smartctl_out
ExitCodeProc ?DUP


Ошибка в строке 79
""
Это что за слово ?
mihast
 
Posts: 51
Joined: Tue, 23 Aug 2005, 21:14

Re: Автоматическая проверка S.M.A.R.T.

Postby Morituruz » Tue, 13 Nov 2012, 08:09

mihast wrote:Это что за слово ?

Для работы задачи нужен этот плагин:
viewtopic.php?f=5&t=10296
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests