web-dev-qa-db-ja.com

ddでpvを使用する方法は?

Ddとpvを使用して、USBドライブにISOを書き込もうとしています。やった:

iso="myiso.iso"; dd if="$iso" bs=1M | pv --eta --size $(ls -l "$iso" | awk '{print $5}') --progress --bytes --rate --wait > /dev/sdg

このガイドに従う: https://Gist.github.com/rriemann/1406035

ただし、pvの出力に従って、isoが非常に迅速に「書き込まれる」ことが起こります。私はそれがすべてディスクキャッシュまたは同様のものに入れられていると思います。次に、pvがハングします。 psは、pvがまだ実行されていることを示していますが、ddは実行されていません。 stracing pvを試しましたが、出力がなく、straceもハングします! ctrl + cはstraceに影響を与えません。実際、信号15、3、2、または1には応答しません。各信号を数分間待ちました。私は最終的に9を送ることを余儀なくされました。

これによると: http://www.reddit.com/r/linux/comments/1xvr25/linux_tip_dont_use_kill_9/ straceバイナリの動作が悪い。

これが私の質問です:

  1. どうすればPVレポートをより有用なデータにすることができますか?私はそれがおそらく「想定されている」ことをしていることを知っています。つまり、パイプするバイトについて報告するだけです。しかし、それは私が知りたいことには役立ちません。これは、USBドライブやイータなどに書き込まれたバイトの概算です。

  2. Straceが信号に応答しないのはなぜですか?私の推測では、straceは、監視しているプロセスからのシステムコールを待ってから、次のシグナルを処理します。これはバグと見なされます。しかし、それは単なる推測です。 straceバージョン4.5.20。

3
cat pants

スティックのもう一方の端にddを置き、そのdirectフラグとsyncフラグを使用してキャッシュを回避しようとすることができます。

pv "$iso" | dd bs=1M oflag=direct,sync of=/dev/sdg

これで、最大でddのブロックサイズ、この場合は1M...に加えて、パイプ|自体にあるものすべてをキャッシュする必要があります。

4
frostschutz