回答:
2016年更新:GNU coreutils> = 8.24(Ubuntu Xenial 16.04以降のデフォルト)を使用する場合、進行状況を表示する別の方法については、以下の方法2を参照してください。
pv
pv
入力/出力専用dd
コマンドの間にインストールして配置します。
注:既に開始している場合は使用できませんdd
。
パッケージの説明から:
pv
-パイプビューアー-パイプラインを介してデータの進行状況を監視するための端末ベースのツールです。2つのプロセス間の通常のパイプラインに挿入して、データの通過速度、所要時間、完了までの時間、完了までの推定時間を視覚的に示すことができます。
設置
sudo apt-get install pv
例
dd if=/dev/urandom | pv | dd of=/dev/null
出力
1,74MB 0:00:09 [ 198kB/s] [ <=> ]
--size
時間の見積もりが必要な場合は、おおよそのサイズを指定できます。
例/ dev / sdbからコピーされる2GBのディスクを想定
なしのコマンドpv
:
sudo dd if=/dev/sdb of=DriveCopy1.dd bs=4096
コマンドを使用しましたpv
:
sudo dd if=/dev/sdb | pv -s 2G | dd of=DriveCopy1.dd bs=4096
出力:
440MB 0:00:38 [11.6MB/s] [======> ] 21% ETA 0:02:19
その他の用途
もちろん、pv
直接出力をstdoutにパイプするために使用できます。
pv /home/user/bigfile.iso | md5sum
出力
50,2MB 0:00:06 [8,66MB/s] [=======> ] 49% ETA 0:00:06
この場合、pv
サイズは自動的に認識されることに注意してください。
status
追加された新しいオプションdd
dd
GNU Coreutils 8.24+(Ubuntu 16.04以降)ではstatus
、進行状況を表示する新しいオプションが追加されました。
dd if=/dev/urandom of=/dev/null status=progress
462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s
dd if=/dev/zero bs=1M count=35000 | pv | dd of=VirtualDisk.raw
。
pv bigfile.iso | dd of=VirtualDisk.raw bs=1M count=35000
動作確認済み。@SopalajodeArrierez、パラメーターは2番目のddで指定できます。
dd if=/dev/urandom | pv | of=/dev/sdb
書き込みで最大18MB /秒、書き込みで最大dd if=/dev/zero | pv | of=/dev/sdb
80MB /秒、古いdd if=/dev/zero of=/dev/sdb
もので最大550MB /秒(SSD最大書き込み速度に近い)。ですべてbs=4096000
。
kill
コマンドを使用して、ddを停止せずに進行状況を監視できます。
dd
実行中の進行状況を確認するには、別のターミナルを開いて次のように入力します。
sudo kill -USR1 $(pgrep ^dd)
これにより、プロセスを停止することなくdd
、dd
ターミナルウィンドウに進行状況が表示されます。BSDまたはOS Xを使用している場合は、のINFO
代わりに使用しますUSR1
。USR1
信号は、DDを終了します。
dd
進行状況の定期的な更新を取得する場合は、次を入力します。
watch -n5 'sudo kill -USR1 $(pgrep ^dd)'
watch
dd
-n秒(-n5
= 5秒)ごとにプロセスをプローブし、停止せずにレポートします。
上記のコマンドの適切な一重引用符に注意してください。
kill -INFO $(pgrep ^dd$)
BSDシステム(OSXなど)で使用する必要があります。
sudo pkill -usr1 dd
覚えやすく、完全に正常に動作し(少なくともUbuntu 14.04で)、入力しにくいです。
pv
TeddHansenが示したように、転送が遅くなるのではないかと心配しているので、これが気に入っています。また、多くの人がこれをグーグルしているのは間違いないでしょう。なぜなら、彼らはすでにdd
操作を開始しているからです;)
pv
他の回答よりも少ないタイピングまたはより多くの進歩を備えたいくつかの便利なサンプル使用法:
最初に、次pv
のコマンドでをインストールする必要があります。
sudo apt-get install pv
次に、いくつかの例を示します。
pv -n /dev/urandom | dd of=/dev/null
pv -tpreb source.iso | dd of=/dev/BLABLA bs=4096 conv=notrunc,noerror
注:最初のサンプルは、5文字少ない入力dd if=/dev/urandom | pv | dd of=/dev/null
です。
そして、ディスクドライブのクローンを作成するのに私のお気に入り(Xをドライブ文字で置き換えます):
(pv -n /dev/sdX | dd of=/dev/sdX bs=128M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running dd command (cloning), please wait..." 10 70 0
ソース:http : //www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/
自分自身をアーカイブするためにも。
dialog
のコマンドでもインストールする必要がありますapt-get install dialog
dialog
例を。セレニティナウ!
dialog
これがシェルスクリプトの作成に非常に役立つことが
brew install pv dialog
Mac用。また、この紳士はスタイルで計算します。ブラボー。
実行中にCtrl+ Shift+ Tを使用dd
すると、進行状況(バイト単位)が出力されます。
load: 1.51 cmd: dd 31215 uninterruptible 0.28u 3.67s
321121+0 records in
321120+0 records out
164413440 bytes transferred in 112.708791 secs (1458745 bytes/sec)
dd
です。
^T
はターミナルにのみ出力します(多くのターミナルアプリはCtrl-Shift-Tをインターセプトし、新しいタブを開きます)。OSX / BSD上の多くのサーチャーは、この答えを理解し得るが、それはそれはUbuntuのためではないことが明らかにされるべきである(あるいは一般的にはGNU / Linuxの?)
完全を期すために:
GNU coreutilsのバージョン8.24には、進行状況を出力するパラメーターを導入するddのパッチが含まれています。
dd:ステータスを定期的に出力するための新しいstatus = progressレベル
Ubuntu 16.04.2 LTSを含む多くのディストリビューションがこのバージョンを使用しています。
apt install build-essential
とをコンパイルした方法を追加してapt-get build-dep coreutils
、coreutils-8.25.tar.xzをダウンロードtar xvf coreutils-8.25.tar.xz
configure --prefix=$HOME/usr/local
して実行しmake
ます。新しくコンパイルされたものdd
はsrc
dirの下にあります。これを/ binにコピーして、既存のものまたはsrc / ddとして実行されているjusを置き換えることができます
最適なのはhttp://dcfldd.sourceforge.net/を使用することです。apt-get を使用して簡単にインストールできます。
dd
オプション(ブロック内のN)のオプションがあります。私はそれを別名:)status=on
statusinterval=N
sizeprobe=[if|of]
DD
ネイティブの進行状況がddに追加されました!!!
新しいバージョンのCoreutils(8.24)は、dd
ツールに進行状況を追加します。
Xubuntu 15.10での使用:
ターミナルを開き、次のコマンドを入力します。
wget ftp://ftp.gnu.org/pub/gnu/coreutils/coreutils-8.24.tar.xz
tar -xf coreutils-8.24.tar.xz
cd coreutils-8.24
./configure && make -j $(nproc)
dd
ルートとして実行:
sudo su
cd src
./dd if=/dev/sdc of=/dev/sda conv=noerror status=progress
表示されるのは、バイト、秒、速度(バイト/秒)です。
のバージョンを確認するにはdd
:
ネイティブ:
dd --version
新着:
cd coreutils-8.24/src
./dd --version
既にddを起動していて、ディスクにペンドライブのコピーを作成するときなどにファイルを書き込む場合、watchコマンドを使用して出力ファイルのサイズを常に監視し、変更を確認して完了を推定できます。
watch ls -l /pathtofile/filename
ファイルサイズのみを表示するには(h-humanビュー):
watch ls -sh /pathtofile/filename
dd | pv | dd
トライアドはちょうどDD使用して260秒とは対照的に、私の50ギガバイトのVMのコピーは、800秒かかりました。このパイプラインでは、少なくともpvには入力ファイルの大きさがわからないため、自分がどれだけ遠くにあるかを伝えることができないため、次のように行うことで不利な点はありません。
私は大きなものでpvを避けます、そして(Bashを使用している場合):
Control-Z ddプロセス
bg
バックグラウンドに配置します。後者の番号がプロセスIDであるbg
ような出力が得られることに注意してください[1] 6011
。だから、やる:
while true; do kill -USR1 process_id ; sleep 5; done
process_idは、観察したプロセスIDです。次のようなものが表示されたら、Control-Cを押します。
[1]+ Done dd if=/path/file.qcow2 of=/dev/kvm/pxetest bs=4194304 conv=sparse
-bash: kill: (60111) - No such process
できました。
編集:愚かなシステム管理者!あなたの人生を自動化してください、動作しません!監視したいddプロセスが長い場合、エンチラーダ全体を処理するワンライナーがあります。これをすべて1行に入力します。
dd if=/path/to/bigimage of=/path/to/newimage conv=sparse bs=262144 & bgid=$!; while true; do sleep 1; kill -USR1 $bgid || break; sleep 4; done
もちろん、スクリプトを作成して、$ 1を入力ファイルに、$ 2を出力ファイルにできます。これは読者の演習として残されています。キルの前に少しスリープする必要があることに注意してください。キルが終了しない場合、ddにシグナルを送信しようとして死ぬ可能性があります。必要に応じて睡眠を調整します(2番目の睡眠を完全に削除することもあります)。
Bash- FTW!:-)
while
ループを圧縮します。を使用しwatch
ます。
sudo watch pkill dd
。その後dd
、快適に統計情報を出力します。
watch pkill -USR1 -x dd
いるため、どのPIDがシグナルを取得するかはほとんど気にしません。私watch
は他の同様のタスクにも使用しているため、これは当然のことです。
http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html
基本的に:
kill -USR1 < dd pid >
dd if=... of=... bs=4M status=progress oflag=dsync
oflag=dsync
あなたの文章の同期を保つので、の情報status=progress
はより正確です。ただし、少し遅いかもしれません。
conv=fsync
良いです
Ubuntu 16.04にはdd(coreutils)バージョン8.25が付属しています。したがって、このオプションstatus=progress
はサポートされています:-)
使用するstatus=progress
には、dd
コマンドとともに追加するだけです。
例:
dd bs=4M if=/media/severus/tools-soft/OperatingSystems/ubuntu-16.04-desktop-amd64.iso of=/dev/null status=progress && sync
ステータスを
1282846183 bytes (1.2 GiB, 1.1 GiB) copied, 14.03 s, 101.9 MB/s
私はddrescueが本当に好きで、ddとして機能しますが、出力を提供し、エラーで失敗しません。それどころか、非常に高度なアルゴリズムを持ち、コピーを成功させるために本当に一生懸命試みます...
プロジェクト:https : //www.gnu.org/software/ddrescue
ウィキペディア:https : //en.wikipedia.org/wiki/Ddrescue
進行状況の表示にdd
使用pv
するbashラッパーを作成しました。それをあなたに入れて、いつものように.bashrc
使用しますdd
:
# dd if=/dev/vvg0/root of=/dev/vvg1/root bs=4M
2GB 0:00:17 [ 120MB/s] [===========================================================>] 100%
0+16384 records in
0+16384 records out
2147483648 bytes (2.1 GB) copied, 18.3353 s, 117 MB/s
ソース:
dd()
{
local dd=$(which dd); [ "$dd" ] || {
echo "'dd' is not installed!" >&2
return 1
}
local pv=$(which pv); [ "$pv" ] || {
echo "'pv' is not installed!" >&2
"$dd" "$@"
return $?
}
local arg arg2 infile
local -a args
for arg in "$@"
do
arg2=${arg#if=}
if [ "$arg2" != "$arg" ]
then
infile=$arg2
else
args[${#args[@]}]=$arg
fi
done
"$pv" -tpreb "$infile" | "$dd" "${args[@]}"
}
#!/bin/bash
。下部:tmp=":${PATH}:"; tmp=${tmp/:/usr/local/bin:/:}; tmp=${tmp%:}; PATH=${tmp#:}; dd "$@"
または、dd
場所をハードコードすることもできます。次にを使用しますlocal dd=/usr/bin/dd
。実行可能ビットを追加することを忘れないでください:chmod +x /usr/local/dd
。
そのため、今日、実行kill
中にループで実行しようとすると少しイライラしdd
、それらを簡単に並行して実行するためのこの方法を思いつきました。
function vdd {
sudo dd "$@" &
sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}
これでvdd
、通常使用する任意の場所を使用するだけでdd
(すべての引数が直接渡されます)、5秒ごとに進行状況レポートが出力されます。
唯一の欠点は、ddが完了してもコマンドがすぐに返らないことです。そのため、このコマンドは、ddが戻ってから気づいて終了するまで、さらに5秒待機する可能性があります。
CentOSの土地の誰かがこのスレッドを見つけた場合に備えて...
'status = progress'オプションはCentOS 7.5および7.6で動作します
上記の@davidDavidsonによる回答は、この機能がCoreutils 8.24で新たに追加されたことを意味しています。
GNU coreutilsのバージョン8.24には、進行状況を出力するパラメーターを導入するddのパッチが含まれています。
この場合もありますが、CentOSは同じバージョン管理スキームに従っていない可能性があります。
CentOS 7.6.1810に付属するCoreutilsのバージョンは次のとおりです。
coreutils-8.22-23.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts
また、インストールされるddのバージョンは次のとおりです。
[root@hostname /]# dd --version
dd (coreutils) 8.22
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Paul Rubin, David MacKenzie, and Stuart Kemp.
これは、バージョン8.22を示しています。
ただし、CentOS 7.5とCentOS 7.6(Coreutilsのバージョン8.22の両方)でddを使用して 'status = progress'をテストしましたが、正常に機能します。
RedHatがこのような古いバージョンのCoreutilsを使用することを選択した理由はわかりませんが、8.22には機能が存在します。
上記のように、少なくともGNU coreutilsの「dd」またはbusyboxでは、進捗情報をstderrに出力することでUSR1シグナルに応答します。
私はddの小さなラッパースクリプトを作成しました。このラッパースクリプトは、優れたパーセント完了インジケーターを示し、ddのプロセスや機能の方法に干渉しないようにしています。githubで見つけることができます:
http://github.com/delt01/dd_printpercent
残念ながら、このSIGUSR1トリックは、GNU dd(coreutilsパッケージから)またはbusyboxの 'dd'モードでのみ機能し、その特定の機能はコンパイル時に有効になります。FreeBSDやOS Xなど、ほとんどのBSDシステムに含まれる標準の「dd」では動作しません... :(
を使用して、coreutilsプログラムの進行状況を監視できprogress - Coreutils Progress Viewer
ます。
以下を監視できます。
cp mv dd tar cat rsync grep fgrep egrep cut sort md5sum sha1sum sha224sum sha256sum sha384sum sha512sum adb gzip gunzip bzip2 bunzip2 xz unxz lzma unlzma 7z 7za zcat bzcat lzcat split gpg
マンページを見ることができます
コマンドの実行中に別のターミナルウィンドウで使用するか、ddコマンドで起動できます。
dd if=/dev/sda of=file.img & progress -mp $!
ここで&
は、最初のコマンドを分岐し、コマンドが終了するまで待つのではなく、すぐに続行します。
progressコマンドは次のコマンドで起動-m
されます。監視対象プロセスが終了するまで待機する-p
ため、指定されたpidを監視し$!
、最後のコマンドpidになります。
sudoを使用してddを発行する場合は、進捗も必要です。
sudo dd if=/dev/sda of=file.img &
sudo progress -m
# with no -p, this will wait for all coreutil commands to finish
# but $! will give the sudo command's pid