Blog

How to See What dd Is Doing: Progress Monitoring for Linux Disk Commands

You've kicked off a dd command to create a bootable USB or clone a drive. The terminal sits there, cursor blinking. Is it working? Did it freeze? Did you forget to specify the output device? These questions plagued Linux users for years—until 2015.

The dd utility has been the go-to tool for low-level disk operations since the early Unix days. It copies and converts data at the block level, making it indispensable for tasks like erasing drives, writing ISO images to USB, and creating full disk backups. The problem? By default, dd reveals nothing about its progress. You're flying blind.

What happened

  • GNU coreutils 8.24 added `status=progress` to dd in 2015
  • Running dd without progress monitoring? Use `kill -USR1` to get status without restarting
  • Combine with `watch` for automatic periodic updates
  • Works on most modern Linux distributions
  • No need to cancel and rerun long operations just to see progress

The native solution: status=progress

In 2015, GNU coreutils 8.24 introduced the `status=progress` argument for dd. This small addition transformed the command from opaque to informative. Adding it to any dd command prints transfer statistics to stderr periodically, showing bytes copied and transfer speed.

The syntax is straightforward. Append `status=progress` to your dd command and it works automatically:

“`bash

Dd if=/path/to/some.iso of=/dev/sdX status=progress

“`

You'll see output showing bytes copied and speed refresh on your screen. For USB drives writing large distribution images, this visibility is essential. You know the operation is alive and roughly how long it will take.

Recovering progress for already-running commands

Here's the scenario: you've started dd, walked away, and returned to find it still running. You forgot the progress flag. The old solution was to cancel and restart with the flag enabled. But that wastes time on operations that might take a significant amount of time.

The better approach uses Unix signals. The USR1 signal tells a running dd process to print its current status to stderr. While dd runs, open a second terminal and execute:

“`bash

Kill -USR1 $(pgrep ^dd$)

“`

The dd process prints its progress instantly without interruption. The operation continues running. This works because dd, by default, handles the USR1 signal by printing status and resuming.

Our analysis: why this matters for your workflow

The lack of progress feedback wasn't just annoying—it created real problems. Users cancelled operations prematurely because they assumed the system had frozen. Others walked away and returned to find the task completed or failed hours earlier with no record of what happened.

The `status=progress` addition represents a shift in how command-line tools handle user experience. Unix utilities traditionally prioritized efficiency over feedback. The 2015 change acknowledges that modern users need visibility, especially for operations that might take considerable time.

For our readers—the tech-savvy crowd running custom ROMs, managing multiple Android devices, or dabbling in Linux for embedded projects—these progress monitoring techniques translate directly to safer disk management. Whether you're flashing a custom recovery image to a phone via fastboot or creating a bootable Linux USB to tinker with, knowing your operation's status prevents costly mistakes.

A practical example

Say you're creating a bootable USB for a new Linux distribution. The ISO is large and you're writing to a drive that may use older technology. The operation could take some time.

You run the command but forgot the progress flag. Your terminal shows only a blinking cursor.

Instead of cancelling, you open another terminal window and type:

“`bash

Watch -n 5 'kill -USR1 $(pgrep ^dd$)'

“`

The watch utility repeats your kill command every few seconds. Every few seconds, your original dd operation prints its status. You can watch progress accumulate without interrupting the write operation. Adjust the interval to suit your needs—you might prefer more frequent updates for important tasks or less frequent ones for background monitoring.

This approach also works when dd runs in a script or as part of an automated workflow where you can't easily modify the original command.

What to watch next

Most modern Linux distributions now ship with coreutils from 2015 or later, so `status=progress` works out of the box. If you're on an older system, updating coreutils gives you this feature plus security fixes.

For Android users with Linux chroots or Termux environments, the same techniques apply. Progress monitoring matters just as much when writing to external storage from a mobile device.

Bottom line: there's no excuse to run dd blind anymore. Use `status=progress` for new commands, and keep the `kill -USR1` trick in your back pocket for the commands you forgot to annotate.

Key takeaways

  • Add `status=progress` to any new dd command for automatic status updates
  • Running dd without progress? Use `kill -USR1 $(pgrep ^dd$)` in another terminal—no restart needed
  • Combine with `watch` for periodic automatic status display
  • These techniques work in standard Linux environments and Android terminal apps like Termux
  • Update coreutils if your system lacks these features

Frequently asked questions

What if my system doesn't have the `pgrep` command?

You can find the dd process ID manually with `ps aux | grep dd` and use that PID directly: `kill -USR1 `

Can I use status=progress with dd running as root?

Yes, the signal and status options work regardless of how dd was started. Just ensure your second terminal uses the same privileges.

Does status=progress work on macOS?

MacOS uses BSD dd, not GNU coreutils. The `kill -USR1` trick works on macOS, but status=progress is GNU-only.

How do I stop the watch command from printing updates?

Press Ctrl+C in the terminal running watch. This only stops the watch process; your original dd operation continues unaffected.

Can I log dd progress to a file instead of the terminal?

Yes, redirect stderr: `dd if=source of=dest status=progress 2>> progress.log` captures the output for later review.

Related