Recently, we were cloning a large hard disk on another using dd
.
This operation took a really long time, at some point we got curious on what the status of the execution was.
Due to the minimal output dd
offers, there was no indication for us whether the system was still copying and if it had a long way to go or not.
Fortunately, the developers of dd
added a feature where sending a USR1
signal to a running dd
process makes it print I/O
statistics to standard error and then resume copying.
To achieve that we used a second terminal and followed these steps:
- We used
pgrep
to look up the running process based on its name and get the dd
running process ID (PID
): pgrep ^dd$
.
- We passed that
PID
to kill -USR1
which triggered the printing of the statistics on the terminal where dd
was executing: kill -USR1 $(pgrep ^dd$)
.
Solution
kill -USR1 $(pgrep ^dd$);
Bonus
Additionally, we wanted to have dd
statistics printed automatically every minute.
To achieve that, we used watch
. watch
executes a program periodically, showing it’s output in full-screen.
We defined the interval in seconds using the parameter -n
. (Please note that, the command will not allow less than 0.1 second interval.)
In the end, our command became as follows:
watch -n 60 kill -USR1 $(pgrep ^dd$)
The above command was sending a USR1
signal to dd
via the kill
application every minute (60 seconds) forcing it to print on standard output the I/O
statistics.
Example
On terminal 1, we executed the command dd if=/dev/sda of=/dev/sdb;
, which will copy disk sda
over sdb
.
On terminal 2, we executed the command kill -USR1 $(pgrep ^dd$);
, which forced dd
to print I/O
statistics back on terminal 1.
0+49728 records in
7218+0 records out
3695616 bytes (3.7 MB) copied, 2.85812 s, 1.3 MB/s
0+78673 records in
11443+0 records out
5858816 bytes (5.9 MB) copied, 4.49477 s, 1.3 MB/s
0+99003 records in
14386+0 records out
7365632 bytes (7.4 MB) copied, 5.75575 s, 1.3 MB/s
^C0+172104 records in
24918+0 records out
12758016 bytes (13 MB) copied, 10.197 s, 1.3 MB/s