cp 실행 진행 상태를 확인하는 방법은 무엇입니까?


54

cp 프로세스 실행 진행 상황을 확인할 수 있습니까? 일부 프로세스는 다양한 KILL 신호에 응답하여 상태를 확인할 수 있습니다. 나는 매개 변수 -v를 사용하여 cp를 실행할 수 있다는 것을 알고 있지만 그렇게 잊어 버린 경우 cp가 매우 오랫동안 실행 중이며 복사중인 파일 또는 이미 복사 된 파일 수를 알고 싶습니다.


대부분의 솔루션 (Linux 및 Mac OS X와 ​​같은 다른 POSIX)은 읽기 작업이 쓰기 작업보다 훨씬 빠르면 실제로 완료되기 훨씬 전에 100 % 표시됩니다. 그 이유는 쓰기 작업이 실제로 수행되기 전에 파일 시스템 캐시에 저장되기 때문입니다. 이 시점에서 상황을 추적하기가 어렵습니다. 이 트릭은 다른 터미널에서 간격을 줄일 수 있습니다 while sleep 1 ; do sync ; done.
Stéphane Gourichon

답변:


31

예, 대상 파일과 로컬 파일에서 stat를 실행하고 파일 크기를 가져옵니다.

stat -c "%s" /bin/ls

그리고 두 값을 비교하여 복사 한 데이터의 백분율을 얻습니다.

다음과 같은 매우 기본적인 구현에서 :

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 2013 년

@manatwork 아 감사합니다, 나는 단지 완전한 예제를 제공하는 게으르고 있었다 :-)
데이지

훌륭합니다. 모든 서버의 도구 상자에 있습니다! 감사!
ACK_stoverflow

Linux 4에서는 하나의 빠른 USB 드라이브에서 오래된 카드 리더기의 저렴한 마이크로 SD에 500MB 파일로 cping : cp 및 sync가 수십 분 동안 중단됩니다. 그러나 소스 파일과 대상 파일을 말하면 cp가 시작된 후 10 대에서 정확히 같은 숫자를 얻습니다.
gcb

40

최신 버전의 Mac OS X에서는 CTRL+ T를 눌러 진행 상황을 확인할 수 있습니다 . cp (1)OSX 10.6 매뉴얼 페이지에서 :

 "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."

Hitting CTRL+ T는 OSX를 포함하여 BSD-ish 시스템에서 SIGINFO로 현재 프로세스를 시그널링하는 것과 같습니다.

이것은 dd (1) 에서도 작동 합니다.

나는 리눅스가이 SIGINFO 메커니즘을 가지고 있다고 생각하지 않으며, cp (1)대한 GNU 매뉴얼 페이지에서 진행 상황을보고하는 데 사용될 수있는 신호에 대해서는 아무것도 보지 못한다 .


1
와! 그것은 나에게 많은 정보를 제공하지는 않지만 내 mv것이 살아 있다는 것을 알기에 충분합니다 . 감사!
Dan Rosenstark

신호를 수신 할 때 복사중인 개별 파일에 대한 완료율 만 알려줍니다. 수행중인 전체 작업의 완료율을 제공하지 않습니다.
Joe C

21

많은 파일을 복사 du -s /path/to/destination하거나 find /path/to/destination | wc -l이미 수행 한 작업에 대한 아이디어를 제공합니다.

lsof -p12341234는 프로세스 ID 인에서 어떤 파일을 복사하고 있는지 확인할 수 있습니다 cp. 많은 시스템에서 pgrep -x cp라는 모든 실행중인 프로세스의 프로세스 ID를보고합니다 cp. 주어진 디렉토리 안에있는 파일들이 복사되는 순서는 예측할 수 없기 때문에이 방법은 그다지 유용하지 않을 수 있습니다 (리눅스의 큰 디렉토리 ls --sort=none에서는 디렉토리 트리를 사용해보십시오 find).

lsof -p1234또한 열 cp에서 현재 파일에 대해 이미 읽고 쓴 바이트 수를 알려줍니다 OFFSET.

Linux에서는 IO 사용 통계가 있습니다 /proc/$pid/io(에 대한 cp프로세스 의 PID 사용 $pidf). rchar값 처리는 읽기 바이트의 총 수이고, wchar프로세스가 작성한 바이트 수이다. 여기에는 파일의 데이터뿐만 아니라 디렉토리의 메타 데이터도 포함됩니다. 해당 수치를 du /path/to/source(파일 데이터 만 계산하는) 획득 한 대략적인 수치와 비교할 수 있습니다 . read_byteswrite_bytes전용, 읽기 또는 저장에서 기록 된 내용을 포함 이미 캐시 또는 정지 버퍼 터미널 진단 및 데이터를 제외 즉.


4
watch lsof -p1234
mchid

3
또는 한 번에 모두 :watch lsof -p`pgrep -x cp`
Mike

15

정확하게 진행 되는 비교적 새로운 도구 (이전의 cv [coreutils viewer]).

무엇입니까?

이 도구는 시스템에서 현재 실행중인 coreutils 기본 명령 (cp, mv, dd, tar, gzip / gunzip, cat 등)을 찾는 Tiny, Dirty, Linux 및 OSX 전용 C 명령으로 설명 할 수 있습니다. 복사 된 데이터의 백분율을 표시합니다.

어떻게 작동합니까?

그것은 단순히 스캔 /proc흥미로운 명령에 대해 다음 디렉토리에서 찾습니다 fdfdinfo열 파일을 찾을 수 및 위치를 추구하는, 가장 큰 파일의 상태를보고합니다.


5
이 폴더의 유틸리티는 현재 진행 호출됩니다 github.com/Xfennec/progress
타비 Ilves

14

(리눅스에서)이 내 좋아하는 트릭 중 하나는의 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]

큰 재귀를 실행하는 경우 현재 작업 디렉토리를 얻는 데 cp사용할 수 있습니다 pwdx.

pwdx [cp의 pid]

4

OP는 "cp"명령이 어떻게 진행되고 있는지 확인할 수있는 기능을 구체적으로 언급했지만 다른 유틸리티가이 특정 문제에 더 적합하다고 말해야합니다.

예를 들면 다음과 같습니다.

rsync -avP FROM TO

FROM 파일 / 폴더를 TO 파일 / FOLDER로 복사하는 과정을 보여줍니다.


# 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.
muru

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]
데이터를 전송하는 대신 FDprocess 파일 설명자를보고 PID진행 상황을 표시하십시오. […] a 만 PID지정하면 해당 프로세스가 감시되고 열려있는 모든 일반 파일 및 차단 장치에 진행률 표시 줄이 표시됩니다. pv프로세스 때 프로세스가 종료됩니다 PID종료합니다.

( 소스 )

러닝의 PID cp( pidof cp)를 찾으십시오 . 12345라고 가정하겠습니다. 그런 다음 간단히

pv -d 12345

노트:

  • 실행 pv하는 동일한 사용자 cp(또는 루트)로 실행하십시오 .
  • 복사는 한 파일을 읽고 다른 파일에 쓰는 것을 의미하기 때문에 한 번에 두 개의 파일이 모니터링되는 것을 볼 수 있습니다.
  • cp현재 작은 파일을 처리하는 경우 출력에 모든 파일이 표시되지 않을 수 있습니다 (작은 파일을 너무 빨리 닫아서 가져 오지 못할 수 있습니다 pv). 그러나 일부는 나타날 것이므로, 당신은 무엇을 말할 수 있습니다 cp.
  • pv -d "$(pidof cp)"작동 할 수 있습니다. 그러나 둘 이상의 cp실행이 있으면 작동하지 않습니다. 이 pidof -s최대 하나의 PID에 반환하지만, 당신은 오른쪽에 속할 확신 할 수 없어 cp많은있을 경우 공정.

-1

프로세스에 신호를 보낼 수 있습니다.

kill -SIGUSR1 pid

Ctrl-C를 누르거나 프로세스가 완료 될 때까지 폴링하는 스크립트를 작성하는 것이 훨씬 더 유용합니다.

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

dd에서 작동합니다. cp에서는 작동하지 않습니다 . 다른 신호를 사용해야 할 수도 있습니다. 한 번 SIGINFO를 시도했지만 인텔 플랫폼에 더 이상 존재하지 않는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.