web-dev-qa-db-ja.com

cpの実行の進行状況を確認する方法は?

Cpプロセスの実行の進行状況を確認することは可能ですか?一部のプロセスはさまざまなKILLシグナルに応答するため、プロセスのステータスを確認できます。パラメータ-vでcpを実行できることはわかっていますが、それを忘れると、cpが非常に長時間実行され、どのファイルがコピーされているか、またはすでにいくつコピーされているかを知りたいと思います。

59
Petr

はい、ターゲットファイルとローカルファイルでstatを実行し、ファイルサイズを取得します。

つまりstat -c "%s" /bin/ls

そして、あなたは2つの値を比較することによってコピーされたデータの割合を取得します、それだけです

次のような非常に基本的な実装では:

function cpstat()
{
  local pid="${1:-$(pgrep -xn cp)}" src dst
  [[ "$pid" ]] || return
  while [[ -f "/proc/$pid/fd/3" ]]; do
    read src dst < <(stat -L --printf '%s ' "/proc/$pid/fd/"{3,4})
    (( src )) || break
    printf 'cp %d%%\r' $((dst*100/src))
    sleep 1
  done
  echo
}
32
daisy

Mac OS Xの最近のバージョンでは、 CTRL+T 進行状況を確認します。 cp(1)のOSX 10.6 manページ から:

 "If cp receives a SIGINFO (see the status argument for stty(1)) signal,
 the current input and output file and the percentage complete will be
 written to the standard output."

ヒッティング CTRL+T OSXを含むBSD風のマシンでSIGINFOを使用して現在のプロセスにシグナルを送ることと同等です。

これは dd(1) でも機能します。

LinuxがこのSIGINFOメカニズムを持っているとは思わないし、進行状況の報告に使用できるシグナルについて cp(1)のGNUページ には何も表示されません。

43
erco

多数のファイルをコピーする場合、_du -s /path/to/destination_または_find /path/to/destination | wc -l_を使用すると、実行済みの量を把握できます。

_lsof -p1234_でコピーされているファイルを確認できます。1234はcpのプロセスIDです。多くのシステムでは、_pgrep -x cp_は、cpという名前の実行中のすべてのプロセスのプロセスIDを報告します。指定されたディレクトリ内のファイルがコピーされる順序は本質的に予測できないため、これはあまり役に立ちません(Linuxの大きなディレクトリでは、_ls --sort=none_が通知します。ディレクトリツリーでは、findを試してください)。

_lsof -p1234_はまた、cp列で、現在のファイルに対してOFFSETがすでに読み書きしたバイト数を示します。

Linuxでは、IO _/proc/$pid/io_の使用統計があります(ここでも、_$pidf_にはcpプロセスのPIDを使用してください)。rcharの値はバイトの総数ですプロセスが読み取ったこと、およびwcharはプロセスが書き込んだバイト数です。これには、ファイル内のデータだけでなく、ディレクトリ内のメタデータも含まれます。この数値は、_du /path/to/source_(これはファイルデータのみをカウントします)_read_bytes_および_write_bytes_には、ストレージから読み取られたものまたは書き込まれたもののみが含まれます。つまり、すでにキャッシュにあるか、まだバッファにある端末診断とデータは除外されます。

これを正確に実行する比較的新しいツールは progress (以前のcv [coreutils viewer])です。

それは何ですか?

このツールは、現在システムで実行されているcoreutils基本コマンド(cp、mv、dd、tar、gzip/gunzip、catなど)を検索する、Tiny、Dirty、LinuxおよびOSXのみのCコマンドとして説明できます。コピーされたデータの割合を表示します。

それはどのように機能しますか?

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

16
Amr Mostafa

これ(Linuxの場合)の私のお気に入りのトリックの1つは、cpプロセスのPIDを調べ(_ps | grep cp_または類似のものを使用)、次に_/proc/$PID/fd/_および_/proc/$PID/fdinfo/_。

_$ cp -r y z
^Z
$ ls -l /proc/8614/fd
lrwx------ 1 jander jander 64 Aug  2 15:21 0 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug  2 15:21 1 -> /dev/pts/4
lrwx------ 1 jander jander 64 Aug  2 15:20 2 -> /dev/pts/4
lr-x------ 1 jander jander 64 Aug  2 15:21 3 -> /home/jander/y/foo.tgz
l-wx------ 1 jander jander 64 Aug  2 15:21 4 -> /home/jander/z/foo.tgz
_

これにより、プロセスが開いているファイルが表示されます。プロセスがファイルのどこまで進んでいるかを確認したい場合...

_$ cat /proc/8614/fdinfo/3
pos:    105381888
flags:  0500000
_

posパラメーターは、読み取り(または書き込み)ポインターの位置(バイト単位)です。

14
Jander

できることがいくつかあります。 straceをそれにアタッチして、それが何をしているかを確認することができます(出力が大量になる可能性があります!):

 strace -p [cpのpid] 

または、lsofを取得して、現在開いているファイルを通知することもできます。

 lsof -p [cpのpid] 

大きな再帰的なcpを実行している場合は、pwdxを使用して現在の作業ディレクトリを取得できます。

 pwdx [pid of cp] 
7
Flup

OPは「cp」コマンドの進行状況を確認する機能について具体的に言及していますが、この特定の問題には他のユーティリティの方が優れていると言わなければなりません。

例えば:

rsync -avP FROM TO

fROMファイル/フォルダをTOファイル/フォルダにコピーする進行状況が表示されます。


# rsync -avP Video.mp4  /run/media/user1/3.8G/

sending incremental file list
Video.mp4
    565,170,046 100%   51.23MB/s    0:00:10 (xfr#1, to-chk=0/1)

sent 565,308,115 bytes  received 134 bytes  5,210,214.28 bytes/sec
total size is 565,170,046  speedup is 1.00

そして、rsyncは、途中でコピーされた量(および転送速度)を通知します。同じマシン上またはネットワーク全体の単一のファイルまたはフォルダーに対して機能します。

5
Gordon McCrae

cpvの使用法を模倣して書いたpvの小さなラッパーであるcpを追加したいと思います。

シンプルで便利

enter image description here

あなたはそれを得ることができます ここ

2
nachoparker

次のようにlsofを使用すると、 応答@ gilles で参照されるwatchコマンドのリアルタイム出力を取得できます。

watch -n1 lsof -p$(pgrep -x cp)

-n1フラグは更新間隔を1秒に設定しますが、精度を上げるために0.5などの低い値に設定できます。デフォルトは2秒です。

アンパサンド&を使用して、watchコマンドをcpとともに実行することもできます。たとえば、somefile/someplaceにコピーするには、次のようにします。

cp somefile /someplace & watch lsof -n1 -p$(pgrep -x cp)
1
mchid

このツールは、現在システムで実行されているcoreutils基本コマンド(cp、mv、dd、tar、gzip/gunzip、catなど)を探し、コピーされたデータの割合を表示するLinuxユーティリティコマンドです。

https://github.com/Xfennec/cv

1
saidi

できることは、宛先でファイルをチェックすることです。

Cpコマンドがcp -a <my_source> <my_dest_folder>にコピーされているファイルを確認します<my_dest_folder>と各ファイルのサイズ。進行状況を確認できます。 <my_source>は少し複雑(ディレクトリのいくつかの層)であり、小さなスクリプトでステータスを確認できます。このようなスクリプトは、cpプロセスで使用されないI/Oを少し消費する可能性があります。

1
Huygens

pipeviewer を使用することもできます。

for f in *; do
  pv $f > destination/$f
done
0
user77376

_pv -d_を使用:

_-d PID[:FD], --watchfd PID[:FD]_
データを転送する代わりに、プロセスFDのファイル記述子PIDを監視し、その進行状況を表示します。 […] PIDのみが指定されている場合、そのプロセスが監視され、プロセスが開くすべての通常のファイルとブロックデバイスがプログレスバーで表示されます。 pvプロセスは、プロセスPIDが終了すると終了します。

ソース

実行中のcp(_pidof cp_)のPIDを調べます。12345だとします。その後、単に

_pv -d 12345
_

ノート:

  • pvは、cpを実行するのと同じユーザーとして(またはrootとして)実行します。
  • コピーとは1つのファイルを読み取り、もう1つのファイルに書き込むことを意味するため、一度に2つのファイルが監視されることを期待してください。
  • cpが現時点で小さなファイルを処理している場合、出力にそれらすべてが表示されない可能性があります(小さなファイルは、pvがファイルを取得するにはあまりに速く閉じる可能性があります)。しかし、いくつかは表示されるので、それでもcpが何をするかを知ることができます。
  • pv -d "$(pidof cp)"が機能する場合があります。ただし、実行中のcpが複数ある場合は機能しません。最大で1つのPIDを返す_pidof -s_がありますが、多数ある場合、それが正しいcpプロセスに属しているとは確信できません。
0