Monitoring dd progress in Linux makes large disk copies or image writes more predictable. Real-time feedback reveals how much data has been processed and how quickly transfer proceeds, which avoids assuming a long-running command has stalled.
By default, dd writes only a summary when the operation finishes. Newer GNU coreutils releases add the status=progress option that periodically prints a byte counter, while legacy deployments rely on sending a USR1 signal to an existing dd process to trigger an on-demand report. Dedicated helpers such as progress can also watch running core utilities and aggregate transfer statistics.
Because dd commonly targets entire disks and partitions, incorrect parameters can destroy data or overwrite boot sectors. Progress features and external monitors expose throughput and estimated completion time but do not change the underlying risk of selecting the wrong device. Careful validation of source and destination, privileges, and feature availability on the current Linux distribution remains essential before starting any long-running copy.
Steps to monitor dd command progress:
- Open a terminal on Linux with permissions to run dd on the required device or file.
$ whoami user
Running dd against block devices usually requires sudo or root access, while regular files can often be handled as an unprivileged user.
- Create a working directory for the sample output files.
$ sudo mkdir -p /root/sg-work
- Install the progress utility on Debian and Ubuntu before starting long-running transfers.
$ sudo apt update WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Hit:1 http://ports.ubuntu.com/ubuntu-ports noble InRelease Hit:2 http://ports.ubuntu.com/ubuntu-ports noble-updates InRelease Hit:3 http://ports.ubuntu.com/ubuntu-ports noble-backports InRelease Hit:4 http://ports.ubuntu.com/ubuntu-ports noble-security InRelease Reading package lists... Building dependency tree... Reading state information... 5 packages can be upgraded. Run 'apt list --upgradable' to see them. $ sudo apt install --assume-yes progress WARNING: apt does not have a stable CLI interface. Use with caution in scripts. Reading package lists... Building dependency tree... Reading state information... progress is already the newest version (0.17-1). 0 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
Other Linux distributions usually package progress under the same name, installable with tools such as dnf, zypper, or pacman.
- Run dd with the status=progress option to display a continuously updated byte counter.
$ sudo dd if=/dev/zero of=/root/sg-work/dd-demo.bin bs=1M count=20 status=progress 20+0 records in 20+0 records out 20971520 bytes (21 MB, 20 MiB) copied, 0.00518746 s, 4.0 GB/s
The status=progress option prints a live counter during the transfer and a final summary when the operation completes.
- Start a long-running dd process without progress output when the status=progress option is unavailable.
$ sudo dd if=/dev/zero of=/root/sg-work/dd-demo2.bin bs=1M count=20000 oflag=sync &
Older GNU coreutils builds and some embedded environments do not support status=progress, so the command prints only a final summary.
- Identify the running dd process from a second terminal before sending a signal.
$ pgrep -a ^dd 11387 dd if=/dev/zero of=/root/sg-work/dd-demo2.bin bs=1M count=20000 oflag=sync
The pgrep -a form prints both the process ID and the original command line, which helps confirm that the correct dd process is selected.
- Send a USR1 signal to the dd process to print an inline progress report in its original terminal.
$ sudo kill -USR1 11387 1406+0 records in 1406+0 records out 1474297856 bytes (1.5 GB, 1.4 GiB) copied, 2.01343 s, 732 MB/s
The signal causes dd to write a line such as 123456789 bytes (123 MB) copied, 10 s, 12.3 MB/s to the terminal where it started, then the copy continues.
- Run progress against a specific dd process to view its transfer status.
$ sudo progress -p 11387 [11387] dd /root/sg-work/dd-demo2.bin 100.0% (2.0 GiB / 2.0 GiB)
The monitor view updates periodically with per-process percentages, transferred volume, and estimated totals for dd and other supported utilities.
- Observe disk throughput using iostat to confirm I/O activity during dd operations.
$ iostat -dx 1 1 Linux 6.12.54-linuxkit (host.example.net) 01/13/26 _aarch64_ (10 CPU) Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz f/s f_await aqu-sz %util loop0 0.00 0.05 0.00 0.26 0.06 20.89 0.00 1.23 0.00 35.99 3.27 693.56 0.00 4.68 0.00 0.00 2.00 131074.00 0.00 2.86 0.00 0.00 vda 0.30 3.13 0.20 40.02 0.38 10.30 2.40 791.53 3.31 57.99 0.77 330.31 0.44 12505.89 0.00 0.00 0.26 28706.08 1.22 0.23 0.00 0.09 vdb 0.43 415.33 0.00 0.01 0.12 972.93 0.00 0.00 0.00 0.00 0.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
High sustained write throughput and utilization on the target disk indicate that the copy is actively pushing data rather than stalled.
- Confirm successful completion of dd by checking the final summary line and exit status.
20000+0 records in 20000+0 records out 20971520000 bytes (21 GB, 20 GiB) copied, 28.2586 s, 742 MB/s $ echo $? 0
Incorrect if= or of= parameters can irreversibly overwrite partitions or entire disks, so target devices must be verified before starting dd with any of these monitoring methods.
Mohd Shakir Zakaria is a cloud architect with deep roots in software development and open-source advocacy. Certified in AWS, Red Hat, VMware, ITIL, and Linux, he specializes in designing and managing robust cloud and on-premises infrastructures.
