LinuxのDDでパーセンテージを取得する方法はありますか?


41

そのため、ここで何が起こっているのでしょう。

LinuxライブUSBを介してサーバー上のドライブのバックアップを開始しました。ddコマンドバニラで最初のドライブをコピーし始めました。ちょうどsudo dd if=/dev/sda of=/dev/sdc1それから、これが終了するまでコンソールを空白のままにすることを思い出しました。

とにかく、同じドライブに別のバックアップを実行する必要があったので、それを開始しsudo dd if=/dev/sdb of=/dev/sdc3 status=progress、現在の転送速度と進行状況をバイト単位で示すテキスト行を取得しました。

1.8TBのうち何バイトがバックアップされるかを計算するのではなく、バックアップの割合を示す方法を望んでいました。status = progressよりも簡単な方法はありますか?

回答:


68

この質問の回答を見る[ 1 ]

pv

たとえば、開始する前に使用できますpv

sudo apt-get install pv    # if you do not have it
pv < /dev/sda > /dev/sc3   # it is reported to be faster
pv /dev/sda > /dev/sc3     # it seems to have the same speed of the previous one
#or 
sudo dd if=/dev/sda | pv -s 1844G | dd of=/dev/sdc3  # Maybe slower 

出力[ 2 ]

440MB 0:00:38 [11.6MB/s] [======>                             ] 21% ETA 0:02:19

注:
特に大きなファイルのためにあなたが見たいと思ってもman dd、例えば、ハードウェア上のすべてのスピードアップするために必要なオプションを設定しbs=100M、バッファを設定するためにoflag=sync書かれた効果的なバイトをカウントするためには、多分direct...
オプションは-sだけなので、パラメータ整数取ります1.8T-->1844G
最初の行からわかるように、まったく必要ありませんdd


kill -USR1 pid

あなたがいる場合、すでに発売しdd、あなたがそのPIDを個片化したら、コマンドを(Ctrl- Z+ bg、あなたがそれを読んで、またはpgrep ^dd...)あなたが信号を送信することUSR1(あるいはSIGUSR1、またはSIGINFO下記参照)と出力をお読みください。
プログラムのPIDが1234の場合

kill -USR1 1234

dd STDERRの端末で次のように応答します

4+1 records in
4+0 records out
41943040 bytes (42 MB) copied, 2.90588 s, 14.4 MB/s

警告: OpenBSD では、kill[ 3 ]の動作を事前に確認する必要がある場合があります:代わりに使用します
kill -SIGINFO 1234
という名前のsigactionが存在しSIGINFOます。SIGUSR11、この場合には、必要があります終了(プログラムをdd)...
の下でUbuntuの使用-SIGUSR110)。


9
ddコマンドで「bs」を使用すると、非常に高速になることがほぼ確実にわかります。dd if = / dev / blah of = / tmp / blah bs = 100Mのように、一度に1億ブロックを転送する
Sirex

1
@Sirexもちろん、ハードウェアに関連して転送速度を最適化するためにbsを設定する必要があります...答えは、OPのコマンドラインを繰り返しただけです。:
ハスター

3
@Criggie:それはおそらく、ddすべてのwrite()システムコールが既に終了しているfsyncか、closeディスクへの書き込みを待機してブロックされたためかもしれません。遅いUSBスティックでは、デフォルトのLinux I / Oバッファーのしきい値は、ダーティな書き込みバッファーがどれだけ大きいかによって、高速ディスク上の大きなファイルの場合とは質的に異なる動作になります。まだかなりの時間がかかります。
ピーター

5
素晴らしい答え。ただし、OpenBSDでは、正しいkillシグナルはSIGUSR1ではなくSIGINFOであることに注意してください。OpenBSDで-USR1を使用すると、ddが強制終了されます。したがって、新しい環境でこれを試す前に、中断したくない転送で、環境がどのように動作するかをより安全にテストする必要があります。
TOOGAM

1
信号のアドバイスddは本当に素晴らしい情報です。特に、インストールできない/したくないサーバーについてはpv
マイク

38

この種のもののための私の頼りになるツールはprogress

このツールは、現在システムで実行されているcoreutilsの基本コマンド(cp、mv、dd、tar、gzip / gunzip、catなど)を探すTiny、Dirty、LinuxおよびOSXのみのCコマンドとして説明できます。コピーされたデータの割合を表示 します。また、推定時間スループットを表示でき、「トップライク」モード(監視)を提供します。

「<code> progress </ code> in action」スクリーンショット

単に/proc興味深いコマンドをスキャンし、ディレクトリfdを見fdinfoて、開いているファイルを見つけて位置を探し、最大のファイルのステータスを報告します。

それは非常に軽く、事実上すべてのコマンドと互換性があります。

私はそれが特に便利だと思う:

  • pvパイプまたはに比べてdcfldd、操作を開始するときに別のコマンドを実行することを覚えておく必要はありません。事後を監視できます。
  • に比べてkill -USR1、ほぼすべてのコマンドで機能します。誤ってコピーを強制終了しないように、マンページを常にダブルチェックする必要はありません。また、パラメータなしで起動すると、現在実行中の一般的な「データ転送」コマンドの進行状況が表示されるので、PIDを検索する必要さえありません。
  • に比べてpv -d、PIDを検索する必要はありません。

1
注:coreutilsプロセス以上のものを監視できます。単にコマンドの名前を指定します--command <command-name>
jpaugh

1
これは素晴らしい!
フローリス

25

を実行ddし、別のシェルで次のコマンドを呼び出します。

pv -d $(pidof dd) # root may be required

これにより、pvはddプロセスのすべての開かれたファイル記述子の統計を取得します。読み取りバッファと書き込みバッファの両方が表示されます。


2
事後動作します!?すごい!!
jpaugh

3
それはとてもクールです。実際にすべてのデータを3つのプロセスにパイプするメモリ帯域幅+コンテキストスイッチのオーバーヘッドを回避します!@jpaugh:/proc/$PID/fdinfoファイルの位置/proc/$PID/fdを調べて、どのファイル(つまりサイズ)を調べるだけなのでしょうか。そのため、機能は非常にクールで優れたアイデアですが、別のプロセスのファイル位置をポーリングできるLinux APIがあるため、「驚くべき」とは言いません。
ピーター

@PeterCordesファイルの位置がカーネルによって公開されていることに気付きませんでした。(pv事前にパイプラインを慎重に準備することに人生を費やしてきました。)もちろん、私はこれがうまくいくことを一度見たと思います。
jpaugh

9

以下に代わるものがありddますdcfldd

dcflddは、法医学とセキュリティに役立つ機能を備えたGNU ddの拡張バージョンです。

ステータス出力-dcflddは、転送されたデータの量と操作にかかる時間の観点から、進行状況をユーザーに更新できます。

dcfldd if=/dev/zero of=out bs=2G count=1 # test file
dcfldd if=out of=out2 sizeprobe=if
[80% of 2047Mb] 52736 blocks (1648Mb) written. 00:00:01 remaining.

http://dcfldd.sourceforge.net/
https://linux.die.net/man/1/dcfldd


長いコマンド名です...明らかに、劣っています。(+1)
jpaugh

6

パーセンテージとして、いくつかの数学を行う必要がありますが、すでに開始した後でも、人間が読める形式でddの進行状況を取得できます。 kill -USR1 $(pidof dd)

現在のddプロセスは次のように表示されます。

11117279バイト(11 MB、11 MiB)コピー、13.715秒、811 kB / s


4
それは基本的には同じことだstatus=progressできます
rakslice

1
実際、これはstatus = progressが与えるものとまったく同じだと言いました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.