天天看點

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

進度的檢視。

繼續閱讀