Cpプロセスの実行の進行状況を確認することは可能ですか?一部のプロセスはさまざまなKILLシグナルに応答するため、プロセスのステータスを確認できます。パラメータ-vでcpを実行できることはわかっていますが、それを忘れると、cpが非常に長時間実行され、どのファイルがコピーされているか、またはすでにいくつコピーされているかを知りたいと思います。
はい、ターゲットファイルとローカルファイルで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
}
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ページ には何も表示されません。
多数のファイルをコピーする場合、_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
を調べて、開いているファイルを探し、位置を探し、最大のファイルのステータスを報告します。
これ(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
パラメーターは、読み取り(または書き込み)ポインターの位置(バイト単位)です。
できることがいくつかあります。 strace
をそれにアタッチして、それが何をしているかを確認することができます(出力が大量になる可能性があります!):
strace -p [cpのpid]
または、lsof
を取得して、現在開いているファイルを通知することもできます。
lsof -p [cpのpid]
大きな再帰的なcp
を実行している場合は、pwdx
を使用して現在の作業ディレクトリを取得できます。
pwdx [pid of cp]
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は、途中でコピーされた量(および転送速度)を通知します。同じマシン上またはネットワーク全体の単一のファイルまたはフォルダーに対して機能します。
このツールは、現在システムで実行されているcoreutils基本コマンド(cp、mv、dd、tar、gzip/gunzip、catなど)を探し、コピーされたデータの割合を表示するLinuxユーティリティコマンドです。
できることは、宛先でファイルをチェックすることです。
Cpコマンドがcp -a <my_source> <my_dest_folder>
にコピーされているファイルを確認します<my_dest_folder>
と各ファイルのサイズ。進行状況を確認できます。 <my_source>
は少し複雑(ディレクトリのいくつかの層)であり、小さなスクリプトでステータスを確認できます。このようなスクリプトは、cp
プロセスで使用されないI/Oを少し消費する可能性があります。
pipeviewer を使用することもできます。
for f in *; do
pv $f > destination/$f
done
_pv -d
_を使用:
_
-d PID[:FD], --watchfd PID[:FD]
_
データを転送する代わりに、プロセスFD
のファイル記述子PID
を監視し、その進行状況を表示します。 […]PID
のみが指定されている場合、そのプロセスが監視され、プロセスが開くすべての通常のファイルとブロックデバイスがプログレスバーで表示されます。pv
プロセスは、プロセスPID
が終了すると終了します。
( ソース )
実行中のcp
(_pidof cp
_)のPIDを調べます。12345だとします。その後、単に
_pv -d 12345
_
ノート:
pv
は、cp
を実行するのと同じユーザーとして(またはrootとして)実行します。cp
が現時点で小さなファイルを処理している場合、出力にそれらすべてが表示されない可能性があります(小さなファイルは、pv
がファイルを取得するにはあまりに速く閉じる可能性があります)。しかし、いくつかは表示されるので、それでもcp
が何をするかを知ることができます。pv -d "$(pidof cp)"
が機能する場合があります。ただし、実行中のcp
が複数ある場合は機能しません。最大で1つのPIDを返す_pidof -s
_がありますが、多数ある場合、それが正しいcp
プロセスに属しているとは確信できません。