經常使用
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
進度的檢視。