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


54

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


ほとんどのソリューション(LinuxおよびおそらくMac OS Xのような他のPOSIX)は、読み取り操作が書き込み操作よりもはるかに高速である場合、実際の完了の100%はるか前に表示されます。その理由は、書き込み操作が実際に実行される前にファイルシステムのキャッシュに存在するためです。その時点では、物事を追跡することは困難です。このトリックは、ギャップを縮小する可能性があります:別の端末でwhile sleep 1 ; do sync ; done
ステファンゴーリチョン

回答:


31

はい、ターゲットファイルとローカルファイルで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
}

4
あなたの提案の複製を投稿するつもりはないので、ここにコードを追加しました。気にしないでください。
マナトワーク

@manatworkああありがとう、私は完全な例を与えることに怠けていた:
デイジー

素晴らしい、これはすべてのサーバーの私のツールボックスで行われています!ありがとう!
ACK_stoverflow

Linux 4では、1つの高速usbドライブから古いカードリーダーの安価なmicro sdに500MBファイルをcp 'します。cpと同期は数十分間ハングします。しかし、ソースファイルと宛先ファイルを統計処理すると、cpが開始された後、両方の10秒でまったく同じ番号が取得されます。
gcb

40

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+はTOSXを含むBSD風機にSIGINFOと、現在のプロセスをシグナリングすることと等価です。

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

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


1
うわー!それは私に多くの情報を与えませんが、私のmv生きていることを知るのに十分です。ありがとう!
ダンローゼンスターク

シグナルを受信したときにコピーしている個々のファイルの完了率のみを示します。実行中のジョブ全体の完了率は表示されません。
ジョーC

21

大量のファイルをコピーしているとき、du -s /path/to/destinationまたはfind /path/to/destination | wc -lどのくらいの量のファイルがすでに作成されているのかがわかります。

どのファイルがコピーされているかを調べるにlsof -p1234は、1234がのプロセスIDですcp。多くのシステムで、pgrep -x cpという名前の実行中のすべてのプロセスのプロセスIDを報告しますcp。これは、特定のディレクトリ内のファイルがコピーされる順序が本質的に予測できないため、あまり役に立たない場合があります(Linuxの大きなディレクトリでls --sort=noneは、ディレクトリツリーで試してくださいfind)。

lsof -p1234またcp、現在のファイルの読み取りと書き込みのバイト数がOFFSET列に表示されます。

Linuxでは、にIO使用統計があります/proc/$pid/io(ここでも、cpプロセスのPIDを使用します$pidf)。rchar値は、プロセスが読み取ったバイト数の合計であり、wcharプロセスが書き込まれたバイト数です。これには、ファイル内のデータだけでなく、ディレクトリ内のメタデータも含まれます。その数値を、du /path/to/source(ファイルデータのみをカウントする)で取得した近似数値と比較できます。 read_bytesまたwrite_bytes、ストレージから読み取られたものまたは書き込まれたもののみを含めます。つまり、端末の診断と、すでにキャッシュにあるか、まだバッファにあるデータを除外します。


4
リアルタイム:watch lsof -p1234
mchid 14年

3
またはすべてwatch lsof -p`pgrep -x cp`
マイク14年

15

まさにそれを行う比較的新しいツールは進歩です(以前のcv [coreutils viewer])。

それは何ですか?

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

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

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


5
:このutilのは、現在進行と呼ばれるgithub.com/Xfennec/progress
Taaviイルヴス

14

(Linuxで)このための私のお気に入りのトリックの一つはのPID見つけることですcp(使用してプロセスを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パラメータは、バイト単位のポインタ、読み出し(又は書き込み)の位置です。


7

できることがいくつかあります。添付straceして、それが何をしているのかを見ることができます(出力は豊富かもしれません!):

strace -p [cpのpid]

またはlsof、現在開いているファイルを確認できます。

lsof -p [cpのpid]

大きなrecursiveを実行している場合、現在の作業ディレクトリを取得するためにcp使用できますpwdx

pwdx [cpのpid]

4

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は途中でコピーされた量(および転送速度)を示します。同じマシン上またはネットワーク上の単一のファイルまたはフォルダーの両方で機能します。


2
あなたは間違った質問に答えています。あなたが探している質問です:unix.stackexchange.com/questions/2577/...すでに言及答えを持っています、rsync
ムル

1

できることは、宛先のファイルを確認することです。

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


1

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

https://github.com/Xfennec/cv




0

使用pv -d

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

ソース

実行中のPID cppidof cp)を調べます。12345であるとしましょう。その後、単に

pv -d 12345

ノート:

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

-1

プロセスにシグナルを送信できます。

kill -SIGUSR1 pid

Ctrl-Cを押すかプロセスが終了するまでポーリングするスクリプトを作成するとさらに便利です。

while [ : ] ; do kill -SIGUSR1 $1 && sleep 1m || exit ; done

ddで動作します。cpでは機能しません。別の信号を使用する必要があるかもしれません。私はかつてSIGINFOを試しましたが、Intelプラットフォームにはもう存在しないようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.