dd

經(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)度的查看。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容