web-dev-qa-db-ja.com

ddの進捗をどのように監視しますか?

dd は不思議です。ハードドライブを別のハードドライブに複製したり、ハードドライブを完全にゼロにしたりすることができます。ただし、ddコマンドを起動すると、その進行状況を伝えるものは何もありません。コマンドが最終的に終了するまで、カーソルの位置に置かれます。では、ddの進捗状況をどのように監視するのでしょうか?

647
James

From HowTo:ddの進行状況を監視する

killコマンドを使用すると、ddを停止せずに進行状況を監視できます。

実行中のddの進行状況を確認するには、別のターミナルを開いて次のように入力します。

Sudo kill -USR1 $(pgrep ^dd)

これにより、プロセスを停止することなく、ddターミナルウィンドウにdd進行状況が表示されます。 BSDまたはOS Xを使用している場合は、USR1の代わりにINFOを使用します。 USR1シグナルはddを終了します。

dd進捗の定期的な更新を取得する場合は、次のように入力します。

watch -n5 'Sudo kill -USR1 $(pgrep ^dd)'

watchは、-n秒(-n5 = 5秒)ごとにddプロセスをプローブし、停止せずにレポートします。

上記のコマンドの適切な一重引用符に注意してください。

459
James

Update 2016:GNUを使用する場合coreutils> = 8.24(Ubuntu Xenial 16.04以降のデフォルト)、進行状況を表示する別の方法については、以下の方法2を参照してください。


方法1:pvを使用して

pvをインストールし、入力/出力のみddコマンドの間に配置します。

ddを既に開始している場合は使用できません。

From パッケージの説明

pv-Pipe Viewer-パイプラインを介したデータの進行状況を監視するための端末ベースのツールです。 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はサイズを自動的に認識することに注意してください。


方法2:statusに追加された新しいddオプション(GNU Coreutils 8.24+)

dd in 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
718
phoibos

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

注:最初のサンプルは、dd if=/dev/urandom | pv | dd of=/dev/nullの入力より5文字少ないです。

そして、ディスクドライブのクローンを作成するのに私のお気に入り(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

screenshot

ソース: http://www.cyberciti.biz/faq/linux-unix-dd-command-show-progress-while-coping/

自分自身をアーカイブするためにも。

102
JSBach

つかいます 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)
62
01010101

完全を期すために:

バージョン8.24GNU coreutilsには、進行状況を出力するパラメーターを導入するddのパッチが含まれています。

コミット この変更の紹介にはコメントがあります:

dd:定期的に統計を出力する新しいstatus = progressレベル

Ubuntu 16.04.2 LTSを含む多くのディストリビューションがこのバージョンを使用しています。

59
davidDavidson

http://dcfldd.sourceforge.net/ を使用するのが最適です。apt-getを使用して簡単にインストールできます。

33
TheNano

ネイティブの進行状況が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
25
user3394963

すでにddを起動しており、ペンドライブのコピーをディスクに作成するときなどにファイルを書き込む場合、watchコマンドを使用して出力ファイルのサイズを常に監視し、変更を確認して完了を推定できます。

watch ls -l /pathtofile/filename

ファイルサイズのみを表示するには(h-humanビュー):

watch ls -sh /pathtofile/filename
17
fabricator4

dd | pv | ddトライアドにより、ddを使用した260秒ではなく、50GBのvmコピーに800秒かかりました。このパイプラインでは、少なくともpvには入力ファイルの大きさがわからないため、自分がどれだけ遠くにいるかを伝えることができないため、次のように行うことで不利な点はありません。

私は大きなものでpvを避けます(そしてBashを使用している場合):

Control-Z ddプロセス

bgはバックグラウンドに配置します。 bg[1] 6011のような出力を提供することに注意してください。後者の番号はプロセスIDです。だから、やる:

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! :-)

13
Mike S
11
hnasarat

最も簡単なのは:

 dd if=... of=... bs=4M status=progress oflag=dsync

oflag=dsyncは文章の同期を保つので、status=progressの情報はより正確です。ただし、少し遅いかもしれません。

7
zevero

Ubuntu 16.04で

Ubuntu 16.04にはdd(coreutils)バージョン8.25が付属しています。したがって、オプションstatus=progressisサポート:-)

使用するには、ddコマンドとともにstatus=progressを追加するだけです。

例:

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

enter image description here

6
Severus Tux

オプションstatus=progressを使用して、転送中に進行状況を取得します。

さらに、conv=fsyncはI/Oエラーを表示します。

例:

Sudo dd if=mydistrib.iso of=/dev/sdb status=progress conv=fsync
5
MUY Belgium

私はddrescueが本当に好きです。ddとして機能しますが、出力を提供し、エラーで失敗しません。逆に、非常に高度なアルゴリズムを備えており、コピーを成功させるために本当に努力します...

プロジェクト: https://www.gnu.org/software/ddrescue

ウィキペディア: https://en.wikipedia.org/wiki/Ddrescue

enter image description here

4
SuperMau

ddを介してbashラッパーを作成し、pvを使用して進行状況を表示します。 .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[@]}"
}
3
midenok

これにより、ddは2秒ごとに統計情報を提供します。これは、監視のデフォルトです。

watch killall -USR1 dd

2秒ごとから5秒ごとに変更するには、次のように-n 5オプションを追加します。

watch -n 5 killall -USR1 dd
2
Kostyantyn

そのため、今日、killの実行中にddをループで実行しようとすると少しイライラし、それらを簡単に並列実行するためのこのメソッドを思いつきました。

function vdd {
    Sudo dd "$@" &
    Sudo sh -c "while pkill -10 ^dd$; do sleep 5; done"
}

これで、通常vdd(すべての引数を直接渡す)を使用する任意の場所でddを使用するだけで、5秒ごとに進行状況レポートが出力されます。

唯一の欠点は、ddが完了してもコマンドがすぐに返らないことです。そのため、このコマンドは、ddが戻ってから気づいて終了するまで、さらに5秒待機する可能性があります。

2
robru

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で存在します。

2
J Hauss

上記のように、少なくともGNU coreutilsまたはbusyboxの「dd」を使用すると、進捗情報をstderrに出力することでUSR1シグナルに応答します。

ナイスパーセントコンプリートインジケーターを表示するddの小さなラッパースクリプトを記述し、ddのプロセスや機能の方法に干渉しないようにします。 githubで見つけることができます:

http://github.com/delt01/dd_printpercent

残念ながら、このSIGUSR1トリックは、GNU dd(coreutilsパッケージから)またはbusyboxの 'dd'モードでのみ機能し、その特定の機能はコンパイル時に有効になります。 FreeBSDやOS Xなど、ほとんどのBSDシステムに含まれる標準の「dd」では動作しません... :(

1
delt

progress - Coreutils Progress Viewerを使用して、coreutilsプログラムの進行状況を監視できます。

以下を監視できます。

cp mvddtar 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

manpage を見ることができます

コマンドの実行中に別のターミナルウィンドウで使用するか、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
1
labsin