dd is a very useful command to clone disks; however, given the typical size of modern disks, it can easily run for hours without any output. A simple trick allows us to monitor the progress of the cloning.

I will present here three methods to monitor the status of dd; only the first can be used after the command has been launched.

1. Using kill command with USR1 signal
Despite its name, the command kill can send any signal to a process; actually, if it weren’t for its default signal being TERM it could as well being renamed sendsignal. Signal USR1 is a generic signal indicating user-defined conditions; together with USR2 it is used to extend the original set of available signals. Every program can interpret SIGUSR1 and SIGUSR2. When dd receives USR1 signal it displays the current status in the same terminal where it was launched.
So, to monitor the progress of dd launch this command from another terminal:
sudo kill -USR1 $(pgrep ^dd)
If you want to have regular updates you can use the command watch:
watch -n5 'sudo kill -USR1 $(pgrep ^dd)'
where -n5 means “every 5 seconds”; pay attention to the single quotes.
NOTE: BSD or OSX users shall use INFO instead of USR1, because USR1 signal will terminate dd.

2. Using command pv (Pipeline Viewer)
Install command pv with sudo apt-get install pv and use it in conjunction with dd as follows:
dd if=/dev/urandom | pv | dd of=/dev/null
The output will be something like:
1,74MB 0:00:09 [ 198kB/s] [ <=> ]
If you know the size in advance, you can use parameter -s or --size to allow pv to make an estimation of the remaining time:
sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096
440MB 0:00:38 [11.6MB/s] [======> ] 21% ETA 0:02:19

3. Using dd with status option (GNU Coreutils 8.24+ only)
dd if=/dev/urandom of=/dev/null status=progress
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

Source: AskUbuntu