1. Делаем dd, дописывая в файл

dd if=/dev/sda >> /tmp/data 2> /tmp/tst 

2. если виснет - Проверяем состояние.

var=$((time sh -c "dd if=/dev/zero of=ddfile bs=512 count=125 && sync") 2>&1) 

3. узнаем где,

dd: reading `/dev/sda': Input/output error 
  116960+0 records in 
  116960+0 records out 
  59883520 bytes (60 MB) copied, 12.385 s, 4.8 MB/s 
  
  #если в строке с именем диска встречатся error 
  awk '/sda/ {print($5)}' /tmp/tst 

  #тогда узнаем где 
 
  #отрезаем последний символ два раза  
  sed 's/.$//' 
  sed 's/.$//' 

4. останавливаем диск,

# echo 1 > /sys/block/sr0/device/delete 

выключаем ждем и включаем -

wget http://10.9.8.5/port_3480/data_request?id=lu_action&DeviceNum=4&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1&output_format=xml 

5. запускаем снова,

# echo "- - -" > /sys/class/scsi_host/host1/scan 

6. возобновляем dd

dd if=/dev/sda skip=blabla >> /tmp/data 2> /tmp/tst 

Скрипт:

#!/bin/sh
#######################################
start_pos=$1
outputfile=$2
flagfile=/home/mike/out
propusk=8
volume=488397168
#######################################
# выключаем диск и включаем назад
echo 1 > /sys/block/sdb/device/delete
curl -s "http://192.168.10.156/port_3480/data_request?id=lu_action&DeviceNum=4&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0" > /dev/$
echo OFF
sleep 5
curl -s "http://192.168.10.156/port_3480/data_request?id=lu_action&DeviceNum=4&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1" > /dev/$
echo ON
sleep 5
echo "- - -" > /sys/class/scsi_host/host1/scan

while true
do
count=$(echo $volume - $start_pos | bc -l)
echo "Осталось: " $count
dd if=/dev/sdb skip=$start_pos count=$count >> $outputfile 2> $flagfile

if [ $(awk '/sdb/ {print($5)}' $flagfile) = 'error' ]
then
#сообщаем где
echo "ERRORR on "  $(awk '/records in/ {print($1)}' $flagfile)
start_pos=$(echo $(echo $(echo $(awk '/records in/ {print($1)}' $flagfile) | sed 's/.$//') |  sed 's/.$//') + $start_pos + $propusk | bc -l)
echo "Начинаем с: " $start_pos
dd if=/dev/zero count=$propusk >> $outputfile 2> $flagfile

# выключаем диск и включаем назад
echo 1 > /sys/block/sdb/device/delete
curl -s "http://192.168.10.156/port_3480/data_request?id=lu_action&DeviceNum=4&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=0" > /dev/null &&
echo OFF
sleep 5
curl -s "http://192.168.10.156/port_3480/data_request?id=lu_action&DeviceNum=4&serviceId=urn:upnp-org:serviceId:SwitchPower1&action=SetTarget&newTargetValue=1" > /dev/null &&
echo ON
sleep 5
echo "- - -" > /sys/class/scsi_host/host1/scan
fi
done