經(jīng)常使用dd命令制作linux系統(tǒng)盤,相當(dāng)方便迅速。但是用了這么久,突然就想,要是能夠知道dd現(xiàn)在的進(jìn)度該多好,于是查了查,果然找到了。
刻盤的時(shí)候,我們先在一個(gè)shell中使用dd,比如我們把Arch Linux的鏡像刻到U盤/dev/sdc中:
lgl@pArch ~/Downloads $ sudo dd if=archlinux-2016.04.01-dual.iso of=/dev/sdc
此時(shí),在另一個(gè)shell中,我們輸入:
lgl@pArch ~ $ sudo watch -n 5 pkill -USR1 ^dd$
或者:
lgl@pArch ~ $ sudo watch -n 5 pkill -USR1 -x dd
然后,當(dāng)前終端會(huì)顯示:
Every 5.0s: pkill -USR1 -x dd
此時(shí),使用dd命令的終端會(huì)顯示進(jìn)度,直到結(jié)束。
lgl@pArch ~/Downloads $ sudo dd if=archlinux-2016.04.01-dual.iso of=/dev/sdc
[sudo] lgl 的密碼:
記錄了234881+0 的讀入
記錄了234881+0 的寫出
120259072 bytes (120 MB, 115 MiB) copied, 21.7691 s, 5.5 MB/s
記錄了286353+0 的讀入
記錄了286353+0 的寫出
146612736 bytes (147 MB, 140 MiB) copied, 26.7881 s, 5.5 MB/s
記錄了338249+0 的讀入
記錄了338249+0 的寫出
173183488 bytes (173 MB, 165 MiB) copied, 31.8169 s, 5.4 MB/s
……
解釋:
watch - execute a program periodically, showing output fullscreen
watch負(fù)責(zé)周期性執(zhí)行一個(gè)程序,使用-n可以指定執(zhí)行的時(shí)間間隔。-d則會(huì)高亮出這次執(zhí)行和上次執(zhí)行的結(jié)果變化了的地方。所以watch -n 5 pkill -USR1 ^dd$就是每五秒執(zhí)行一次pkill -USR1 ^dd$。
pgrep, pkill - look up or signal processes based on name and other attributes
pkill是根據(jù)名稱或其他屬性來查詢進(jìn)程或給進(jìn)程發(fā)信號(hào)的。?所以pkill -USR1 ^dd$就是給dd進(jìn)程發(fā)送信號(hào)USR1,USR1這個(gè)信號(hào)在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發(fā)送USR1信號(hào),它就會(huì)在標(biāo)準(zhǔn)錯(cuò)誤輸出中輸出I/O數(shù)據(jù),并繼續(xù)復(fù)制(dd的進(jìn)度輸出就是這么設(shè)計(jì)的,再詳細(xì)點(diǎn) 就是dd命令在執(zhí)行的時(shí)候接收到SIGUSR1信號(hào)的輸出當(dāng)前的讀寫進(jìn)度,而pkill命令在這里起的作用就是給dd進(jìn)程發(fā)送這個(gè)信號(hào))。這樣的話就實(shí)現(xiàn)了當(dāng)前進(jìn)度的輸出。
命令中最后的^dd$自然是篩選名稱中僅含有dd的進(jìn)程,否則,所有名稱中包含dd字段的進(jìn)程都會(huì)被選中。我們做個(gè)實(shí)驗(yàn):
lgl@pArch ~ $ pkill -USR1 dd?
pkill: killing pid 2 failed: 不允許的操作
pkill: killing pid 43 failed: 不允許的操作
pkill: killing pid 282 failed: 不允許的操作
pkill: killing pid 548 failed: 不允許的操作
pkill: killing pid 2475 failed: 不允許的操作
lgl@pArch ~ $ ps -A | grep dd
? ? 2 ?? ? ? ? 00:00:00 kthreadd
? 43 ?? ? ? ? 00:00:00 ipv6_addrconf
? 282 ?? ? ? ? 00:00:00 sddm
? 548 ?? ? ? ? 00:00:00 sddm-helper
2475 pts/2? ? 00:00:04 dd
2488 ?? ? ? ? 00:00:00 ksysguardd
由上面可以看到,pkill果然是向所有名稱中包含dd的進(jìn)程都發(fā)送信號(hào)了。
另外,除了使用正則的表示方式之外,我們還可以使用-x來指定進(jìn)程名:
-x, –exact
Only match processes whose names (or command line if -f is specified) exactly match the pattern.
所以,pkill -USR1 -x dd?的作用就是向明確指定進(jìn)程的名字就是dd的進(jìn)程發(fā)送USR1信號(hào)。
所以說,我們通過pkill(發(fā)信號(hào))和watch(周期性執(zhí)行命令)的結(jié)合來實(shí)現(xiàn)了dd進(jìn)度的查看。