1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
use strict;
use IO::Select;
my %smartData;
sub parse_smartctl_line {
my $line = shift;
my $dev = shift;
if ($line =~ /^196 Reallocated_Event_Count.*\s+(\d+)$/) {
print "hINFO_HDD_$dev\_SMART_realocated-event-count|$1\n";
}
if ($line =~ /^197 Current_Pending_Sector.*\s+(\d+)$/) {
print "hINFO_HDD_$dev\_SMART_current-pending-sector|$1\n";
}
if ($line =~ /^198 Offline_Uncorrectable.*\s+(\d+)$/) {
print "hINFO_HDD_$dev\_SMART_offline-uncorrectable|$1\n";
}
if ($line =~ /^199 UDMA_CRC_Error_Count.*\s+(\d+)$/) {
print "hINFO_HDD_$dev\_SMART_udma-crc-error|$1\n";
}
if ($line =~ /^200 Multi_Zone_Error_Rate.*\s+(\d+)$/) {
print "hINFO_HDD_$dev\_SMART_multizone-error-rate|$1\n";
}
if ($line =~ /^209 Offline_Seek_Performnce.*\s+(\d+)$/) {
print "hINFO_HDD_$dev\_SMART_offline-seek-performance|$1\n";
}
if ($line =~ /^read:.+(\d+)$/) {
print "hINFO_HDD_$dev\_SMART_uncorrected-read-errors|$1\n";
}
if ($line =~ /^write:.+(\d+)$/) {
print "hINFO_HDD_$dev\_SMART_uncorrected-write-errors|$1\n";
}
}
sub check_sata {
open my $PART, "/proc/partitions" or return;
my @disks = ();
while (<$PART>) {
chomp;
next unless /\b(sd\D+)\b/;
push @disks, $1;
}
close $PART;
return unless @disks > 0;
foreach my $dev (@disks) {
my @smartctlData = `smartctl -d ata -a /dev/$dev`;
foreach my $line (@smartctlData) {
parse_smartctl_line($line, $dev);
}
}
}
check_sata();
|