6 my $drive = $ARGV[0] || die "usage: $0 /dev/sda\n";
8 my $rewrite_sectors = 16;
14 system "hdparm --write-sector $s --yes-i-know-what-i-am-doing $drive";
19 my $cmd = "smartctl -t select,$sector-max $drive";
26 my $cmd = "smartctl -l selective $drive";
28 open(my $fh, '-|', $cmd);
32 if ( m/Completed_read_failure.*\((\d+)-\d+\)/ ) {
34 print "rewrite sector: $sector\n";
35 foreach my $s ( $sector .. $sector + $rewrite_sectors ) {
40 } elsif ( m/Self_test_in_progress/ ) {
43 } elsif ( m/Not_testing/ ) {
44 if ( $test_started ) {
46 return 1 if $test_started;
48 smart_test 0; # first-time invocation
54 sub smart_last_error {
55 my $cmd = "smartctl -l selftest $drive";
57 open(my $fh, '-|', $cmd);
61 if (/^#\s+1.+Completed: read failure\s+\S+\s+\S+\s+(\d+)/) {
69 smart_last_error || smart_test 0;
72 warn "sleep $delay s", ( $test_started ? " smart test running..." : "idle" ), "\n";