WHDD is a HDD diagnostic and data recovery tool for Linux. It can test a hard drive with reads and writes, while providing intuitive visualization of the process. It also has a function for copying a device, with algorithms optimized for least harm to already-defective source devices. It works with your hard drives at a low level by sending ATA commands, which means that the system doesn't freeze while accessing damaged devices (the device is soft-reset on timeout).
DiskScan scans the entire surface of a disk, alerts when a sector is unreadable, and uses the read timing to warn when a sector is having problems. It will tell when a disk has failed and already has bad sectors and also when the disk is near failure and takes too long to read the data.