天天看点

linux小记:查看dd进度

经常使用

dd

命令制作linux系统盘,相当方便迅速。但是用了这么久,突然就想,要是能够知道

dd

现在的进度该多好,于是查了查,果然找到了。

刻盘的时候,我们先在一个shell中使用

dd

,比如我们把Arch Linux的镜像刻到U盘

/dev/sdc

中:

lgl@pArch ~/Downloads $ sudo dd if=archlinux--dual.iso of=/dev/sdc
           

此时,在另一个shell中,我们输入:

lgl@pArch ~ $ sudo watch -n  pkill -USR1 ^dd$
           

或者:

[email protected] ~ $ sudo watch -n  pkill -USR1 -x dd
           

然后,当前终端会显示:

Every s: pkill -USR1 -x dd 
           

此时,使用dd命令的终端会显示进度:

[email protected] ~/Downloads $ sudo dd if=archlinux-.-dual.iso of=/dev/sdc
[sudo] lgl 的密码:
记录了+ 的读入
记录了+ 的写出
 bytes ( MB,  MiB) copied,  s,  MB/s
记录了+ 的读入
记录了+ 的写出
 bytes ( MB,  MiB) copied,  s,  MB/s
记录了+ 的读入
记录了+ 的写出
 bytes ( MB,  MiB) copied,  s,  MB/s
……
           

直到结束。

解释:

watch - execute a program periodically, showing output fullscreen

watch

负责周期性执行一个程序,使用

-n

可以指定执行的时间间隔。

-d

则会高亮出这次执行和上次执行的结果变化了的地方。所以

watch -n 5 pkill -USR1 ^dd$

就是每五秒执行一次

pkill -USR1 ^dd$

pgrep, pkill - look up or signal processes based on name and other attributes

pkill

是根据名称或其他属性来查询进程或给进程发信号的。

所以

pkill -USR1 ^dd$

就是给

dd

进程发送信号USR1,USR1这个信号在

man dd

里有解释:

Sending a USR1 signal to a running ‘dd’ process makes it print I/O statistics to standard error and then resume copying.

也就是说只要给

dd

发送USR1信号,它就会在标准错误输出中输出I/O数据,并继续复制。这样的话就实现了当前进度的输出。

命令中最后的

^dd$

自然是筛选名称中仅含有

dd

的进程,否则,所有名称中包含

dd

字段的进程都会被选中。我们做个实验:

[email protected] ~ $ pkill -USR1 dd  
pkill: killing pid  failed: 不允许的操作
pkill: killing pid  failed: 不允许的操作
pkill: killing pid  failed: 不允许的操作
pkill: killing pid  failed: 不允许的操作
pkill: killing pid  failed: 不允许的操作

[email protected] ~ $ ps -A | grep dd
     ?        :: kthreadd
    ?        :: ipv6_addrconf
   ?        :: sddm
   ?        :: sddm-helper
  pts/    :: dd
  ?        :: ksysguardd
           

由上面可以看到,

pkill

果然是向所有名称中包含

dd

的进程都发送信号了。

另外,除了使用正则的表示方式之外,我们还可以使用

-x

来指定进程名:

-x, –exact

Only match processes whose names (or command line if -f is specified) exactly match the pattern.

所以,

pkill -USR1 -x dd

的作用就是明确指定进程的名字就是dd。

所以说,我们通过

pkill

(发信号)和

watch

(周期性执行命令)的结合来实现了

dd

进度的查看。

继续阅读