이 옵션을 이미 검색했지만 사용자 지정 패치 와 관련된 솔루션 만 찾았습니다 . 그것이 --help에 표시되지 않고 더 이상 정보를 찾을 수 없다는 사실은 아마도 대답이 '아니오'라고 표시하지만 이것이 확인되고 싶습니다.
rsync 로 전체 파일 전송 진행률 을 표시 할 수 있습니까?
이 옵션을 이미 검색했지만 사용자 지정 패치 와 관련된 솔루션 만 찾았습니다 . 그것이 --help에 표시되지 않고 더 이상 정보를 찾을 수 없다는 사실은 아마도 대답이 '아니오'라고 표시하지만 이것이 확인되고 싶습니다.
rsync 로 전체 파일 전송 진행률 을 표시 할 수 있습니까?
답변:
다나 김이 맞습니다. 총 진행률 표시기를 추가하는 간단한 방법은 없습니다.
그 이유는 rsync가 동기화 할 파일 목록을 볼 때 어떤 파일을 변경해야하는지 미리 알 수 없기 때문입니다. 델타 전송을 수행하는 경우 수행해야 할 작업에 대한 전체 그림을 제공하기 위해 델타 자체를 미리 계산해야합니다.
다시 말해, 얼마나 많은 작업을 수행해야하는지 계산하는 가장 쉬운 방법은 실제로 수행하는 것입니다.
--size-only
것이 더 부정확하다고 생각합니다.
rsync (버전 3.1.0 프로토콜 버전 31, Ubuntu Trusty 14.04로 테스트)에서이를 수행하는 공식적인 방법이 있습니다.
#> ./rsync -a --info=progress2 /usr .
305,002,533 80% 65.69MB/s 0:00:01 xfr#1653, ir-chk=1593/3594)
/usr
전체 파일 시스템을 전송하는이 기능을 원했기 때문에 내 폴더를 사용해 보았으며 /usr
좋은 대표적인 샘플 인 것 같습니다.
은 --info=progress2
단지 부분적인 값의 경우에도 좋은 전반적인 비율을 제공합니다. 실제로 내 /usr
폴더는 6 기가 이상입니다.
#> du -sh /usr
6,6G /usr/
그리고 rsync
이 모든 것을 스캔 시간을 많이했다. 그래서 내가 본 비율은 거의 90 % 정도이지만, 그럼에도 불구하고 무언가가 복사되고 있음을 알면 편안합니다. :)
참고 문헌 :
--info=progress2
작동하지 않는 점-v
--no-i-r
스위치를 추가하면 rsync
복사하기 전에 점진적으로 스캔하지 않고 완전히 스캔하지 않고 남은 작업량을 알고 + 표시합니다.
--human-readable
(또는 -h
)를 사용 하여 전체 크기 (MB / GB)를 볼 수 있습니다 . 진행 중입니다.
'pv'( apt-get install pv
데비안 및 우분투 사용)를 사용할 수 있습니다. 전송되는 데이터의 양은 파일 크기와 관련이 없지만 소스와 대상 사이의 델타에 있으므로 전송 된 파일 수를 모니터링하는 것이 좋습니다. 그리고 파일 수를 세는 것은 하나의 큰 델타와 다른 하나는 작은 델타에 대해 동일한 진행을 계산합니다. 어떤 경우에도 ETA 추정이 멀리 떨어져있을 수 있습니다. 크기 기반 ETA는 목적지가 비어있는 경우에만 작동합니다 (이 경우 delta == size of source).
일반적인 아이디어는 rsync에서 'transfered'파일 당 한 줄을 내보내고 'pv'로 해당 줄을 계산하는 것입니다.
rsync -ai / source remote : / dest | pv -les [파일 수]> / dev / null
나는,이 경우에 당신이 훨씬 저렴 사용할 수 있습니다 (여러 가지 이유로) 백업 전체 파일 시스템에 경향 df
(보다는 파일의 수를 얻기 위해 du
또는 find
rsync를 그것을 한 후 느릅 나무는 소스 계층에게 다른 시간을 통과합니다). -x 옵션은 rsync가 동일한 소스 파일 시스템에 머무르고 다른 내부 마운트를 따르지 않도록하기 위해 나타납니다.
rsync -aix / source remote : / dest | pv -les $ (df -i / source | perl -ane 'print $ F [2] if $ F [5] = ~ m : ^ / :')> / dev / null
일반적인 방법으로 / source에있는 파일을 계산하려면 다음을 사용하십시오 find /source|wc -l
(다시 경고 : I / O에서 느리고 무거울 수 있음).
df -i /source
/ source가 상주하는 모든 파티션에서 inode (파일)의 수 를 가져 오므로 전체 파티션을 재 동기화 할 때만 "df"를 사용 하십시오. 그렇지 않으면 'find'를 사용 하여 "$ ()"표현식 내의 디렉토리 내 파일을 계산하십시오 .
du
이나 find
의 당신이 불완전한 사본을 마무리 또는 삭제와의 현재 위치에서 업데이 트를하고있는 가정 해 봅시다는 - - 사용하는 것입니다 rsync -ai --dry-run
주요 실행가 전달 될 것 같은 파일 목록 얻기 위해pv
다음은 rsync 버전 3.0.0 이상에 적용됩니다. 아래 설명 된 옵션은 2008 년 3 월 1 일 해당 릴리스에서 도입되었습니다.
--info = progress2 와 함께 --no-inc-recursive 옵션 (또는 짧은 --no-ir 별칭)을 사용하여 증분 재귀를 비활성화 할 수도 있습니다 .
이것은 전송이 진행됨에 따라 더 많은 파일을 점진적으로 발견하지 않고 처음에 전체 파일 목록을 작성합니다. 시작하기 전에 모든 파일을 알고 있으므로 전체 진행 상황을 더 잘보고 할 수 있습니다. 이는 파일 수에 적용되며 파일 크기를 기준으로 진행 상황을보고하지 않습니다.
여기에는 절충이 포함됩니다. 전체 파일 목록을 미리 작성하는 것은 메모리 비용이 많이 들며 실제 전송 시작을 상당히 지연시킬 수 있습니다. 예상 한대로 파일이 많을수록 지연 시간이 길어지고 필요한 메모리가 늘어납니다.
다음은 rsync 매뉴얼 (source- http : //rsync.samba.org/ftp/rsync/rsync.html)에서 가져온 것입니다 .
-r,-재귀
이것은 rsync에게 디렉토리를 재귀 적으로 복사하도록 지시합니다. --dirs (-d)도 참조하십시오. rsync 3.0.0부터 사용되는 재귀 알고리즘은 이제 이전보다 훨씬 적은 메모리를 사용하고 처음 몇 디렉토리의 스캔이 완료된 후 전송을 시작하는 증분 스캔입니다. 이 증분 스캔은 재귀 알고리즘에만 영향을 미치며 비 재귀 전송은 변경하지 않습니다. 전송의 양쪽 끝이 버전 3.0.0 이상인 경우에만 가능합니다.
일부 옵션은 전체 파일 목록을 알기 위해 rsync가 필요하므로 증분 재귀 모드를 비활성화합니다. --delete-before, --delete-after, --prune-empty-dirs 및 --delay-updates가 포함됩니다. 이 때문에 --delete를 지정할 때의 기본 삭제 모드는 연결의 양쪽 끝이 3.0.0 이상일 때 --delete-during 중입니다 (이 향상된 삭제 모드를 요청하려면 --del 또는 --delete-during 사용) 명시 적으로). --delete-after를 사용하는 것보다 더 나은 --delete-delay 옵션도 참조하십시오.
--no-inc-recursive 옵션 또는 더 짧은 --no-ir 별칭을 사용하여 증분 재귀를 비활성화 할 수 있습니다 .
특정 버전 차이에 대해서는 https://rsync.samba.org 도 참조 하십시오 (스크롤 다운 및 릴리스 뉴스 링크 확인).
긴 환승을 위해 du -s
양쪽 에서 달리는 것이 행복 합니다. 심지어 watch -n1 du -s
내가 정말로 불안하다고 느낀다면.
watch
du -s
주기적으로 (여기에서 1 초마다) 명령 ( 여기서)을 실행 하고 출력을 전체 화면으로 표시합니다.
watch
명령 의 예를 주셔서 감사합니다 !
기본적으로 아니요. --progress 플래그를 사용하여 파일 당 진행률 만 표시 할 수 있지만 그 정도입니다.
나는 당신이 그 주위에 포장지를 쓸 수 있거나 이미 찾은 패치를 사용할 수 있다고 생각하지만 실제로 가치가 있는지 스스로에게 물어봐야합니다. 실제로 rsync에 대한 전체 진행이 필요합니까?
--progress
사용하여 작업 방식을 변경할 --info=progress2
수 있으며 전 세계 진행 상황이 표시됩니다. 유용하게 사용하려면 증분 재귀 알고리즘을 비활성화해야합니다.--info=progress2 --no-inc-recursive
나는 zerodeux의 대답을 사용하고 내 자신의 작은 bash 스크립트를 작성했습니다.
#!/bin/bash
RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"
echo "Executing dry-run to see how many files must be transferred..."
TODO=$(${RSYNC} --dry-run ${RSYNC_ARGS} ${SOURCES} ${TARGET}|grep "^Number of files transferred"|awk '{print $5}')
${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"
또한 rsync로 전체 진행률을 표시하는 방법을 검색 했으며이 게시물에서 유용한 답변을 찾았습니다. https://stackoverflow.com/questions/7157973/monitoring-rsync-progress
기본적 으로 rsync 3.1.0 의 dev 버전에서 --info = progress2 를 사용할 수 있습니다 . 의사 가 말한 내용은 다음과 같습니다 .
개별 파일이 아닌 전체 전송을 기반으로 통계를 출력하는 --info = progress2 옵션도 있습니다. 파일 이름을 출력하지 않고이 플래그를 사용하십시오 (예 : -v를 피하거나 이름이 많은 화면을 스크롤하지 않고 전송이 수행되는 방식을 보려면 --info = name0을 지정하십시오). --info = progress2를 사용하기위한 progress 옵션.)
--info=name0
is 🌈👑
나는 zerodeux의 대답을 사용하고 내 자신의 작은 BASH 스크립트를 작성했습니다.
#!/bin/bash
RSYNC="ionice -c3 rsync"
# don't use --progress
RSYNC_ARGS="-vrltD --delete --stats --human-readable"
SOURCES="/dir1 /dir2 /file3"
TARGET="storage::storage"
#echo "Executing dry-run to see how many files must be transferred..."
TODO=$(find ${SOURCES} | wc -l)
${RSYNC} ${RSYNC_ARGS} ${SOURCES} ${TARGET} | pv -l -e -p -s "$TODO"
TODO 드라 이런을
TODO=$(find ${SOURCES} | wc -l)
파일 수가 매우 빠릅니다!
find
rsync
로컬로 작동하는 경우에만 작동합니다 . rsync --dry-run
원격 소스에서도 작동합니다.
사용하다
lsof -ad3-999 -c rsync
rsync가 현재 어떤 파일을 열 었는지 (파일 크기를 표시) rsync 사본을 숨겨진 파일에 로컬로 표시하려면
for i in $(pgrep 'rsync'); do ls -l /proc/$i/fd; done
귀하의 솔루션은 더 간단합니다.
나는 이것을 주석으로 만들지 만 평판이 충분하지 않습니다. 선택한 답변에 대한 naught101의 의견에 대한 응답으로 --progress 옵션은 총 전송량 중 전송 된 파일 수를 표시합니다. 나는이 게시물을보고 출력을보다 신중하게 볼 때까지 이것을 알지 못했습니다.
'확인'통계는 전체에서 남은 파일 수를 나타냅니다. 새 대상으로 재 동기화 할 때 가장 많이 사용되므로 모든 파일이 완전히 복사됩니다.
매뉴얼 페이지에서 :
When [each] file transfer finishes, rsync replaces the
progress line with a summary line that looks like this:
1238099 100% 146.38kB/s 0:00:08 (xfer#5, to-check=169/396)
In this example, the file was 1238099 bytes long in
total, the average rate of transfer for the whole file
was 146.38 kilobytes per second over the 8 seconds that
it took to complete, it was the 5th transfer of a regu-
lar file during the current rsync session, and there
are 169 more files for the receiver to check (to see if
they are up-to-date or not) remaining out of the 396
total files in the file-list.
여기서주의해야 할 점은 --info = progress2조차도 완전히 신뢰할 수 없다는 것입니다. 백분율은 진행률이 표시 될 때 rsync가 '알고있는'파일 수를 기반으로하기 때문입니다. 반드시 동기화해야하는 총 파일 수는 아닙니다 (예 : 깊이 중첩 된 디렉토리에서 많은 수의 큰 파일을 발견 한 경우). 진행률 표시에서 --info = progress2가 '점프'하지 않도록하는 한 가지 방법은 동기화를 시작하기 전에 rsync가 모든 디렉토리를 재귀 적으로 스캔하도록하는 것입니다 (기본적으로 증분 재귀 스캔을 수행하는 대신). --no-inc-recursive 옵션도 제공합니다. 그러나이 옵션은 rsync 메모리 사용량과 런타임도 증가시킵니다.
--no-inc-recursive
옵션 또는 더 짧은 --no-i-r
별명을 사용하여 증분 재귀를 비활성화 할 수 있습니다 . (다른 답변보기)
나는 rsync 프로세스 (또는 그 문제에 대한 다른 프로세스)를 위해 / proc // io에서 정보를 추출하는 스크립트를 사용하고 전송할 총 금액을 알고 진행률을 계산합니다.
#!/bin/bash
usage()
{
echo "usage: $0 PID BASEMSIZE [DELAY[s|m|h]]"
}
if [ $# -lt 2 ]; then
usage
exit 1
elif [ $# -eq 3 ]; then
DELAY=$3
else
DELAY=5s
fi
PID=$1
PBASE=`echo "scale=2; $2/1024"|bc`
R_PID=$PID
W_PID=$PID
R_SPEED_MAX=0
W_SPEED_MAX=0
R_SPEED_CUM=0
W_SPEED_CUM=0
R_SPEED_AVG=0
W_SPEED_AVG=0
ETA=0
ETA_H=0
ETA_M=0
ETA_S=0
while [ ! -r /proc/$PID/io ];
do
clear
echo "Waiting for process with PID=$PID to appear!"
sleep 1
done
B_READ_PREV=`cat /proc/$R_PID/io|awk '$1 ~ /^read_bytes/ {print $2}'`
B_WRITE_PREV=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'`
T1=`date +%s.%N`
count=0
while true
do
[ ! -r /proc/$PID/io ] && break
clear
B_READ=`cat /proc/$R_PID/io|awk '$1 ~ /^read_bytes/ {print $2}'`
B_WRITE=`cat /proc/$W_PID/io|awk '$1 ~ /^write_bytes/ {print $2}'`
BL_READ=`echo "scale=2; ($B_READ-$B_READ_PREV)/1048576"|bc`
BL_WRITE=`echo "scale=2; ($B_WRITE-$B_WRITE_PREV)/1048576"|bc`
GB_DONE=`echo "scale=2; $B_WRITE/1073741824"|bc`
PDONE=`echo "scale=2; $GB_DONE*100/$PBASE"|bc`
T2=`date +%s.%N`
TLOOP=`echo "scale=2; ($T2-$T1)/1"|bc`
R_SPEED=`echo "scale=2; $BL_READ/$TLOOP"|bc`
W_SPEED=`echo "scale=2; $BL_WRITE/$TLOOP"|bc`
if [ $count -ge 1 ]; then
R_SPEED_CUM=`echo "scale=2; $R_SPEED_CUM+$R_SPEED"|bc`
R_SPEED_AVG=`echo "scale=2; $R_SPEED_CUM/$count"|bc`
W_SPEED_CUM=`echo "scale=2; $W_SPEED_CUM+$W_SPEED"|bc`
W_SPEED_AVG=`echo "scale=2; $W_SPEED_CUM/$count"|bc`
[ `echo "scale=2; $W_SPEED > $W_SPEED_MAX"|bc` -eq 1 ] && W_SPEED_MAX=$W_SPEED
[ `echo "scale=2; $R_SPEED > $R_SPEED_MAX"|bc` -eq 1 ] && R_SPEED_MAX=$R_SPEED
fi
if [ `echo "scale=2; $W_SPEED_AVG > 0"|bc` -eq 1 ]; then
ETA=`echo "scale=2; (($PBASE-$GB_DONE)*1024)/$W_SPEED_AVG"|bc`
ETA_H=`echo "scale=0; $ETA/3600"|bc`
ETA_M=`echo "scale=0; ($ETA%3600)/60"|bc`
ETA_S=`echo "scale=0; ($ETA%3600)%60"|bc`
fi
echo "Monitoring PID: $PID"
echo
echo "Read: $BL_READ MiB in $TLOOP s"
echo "Write: $BL_WRITE MiB in $TLOOP s"
echo
echo "Read Rate: $R_SPEED MiB/s ( Avg: $R_SPEED_AVG, Max: $R_SPEED_MAX )"
echo "Write Rate: $W_SPEED MiB/s ( Avg: $W_SPEED_AVG, Max: $W_SPEED_MAX )"
echo
echo "Done: $GB_DONE GiB / $PBASE GiB ($PDONE %)"
[ `echo "scale=2; $ETA > 0"|bc` -eq 1 ] && printf "ETA: %02d:%02d:%05.2f (%.2fs)\n" $ETA_H $ETA_M $ETA_S $ETA
echo "Elapsed: `ps -p $PID -o etime=`"
T1=`date +%s.%N`
sleep $DELAY
B_READ_PREV=$B_READ
B_WRITE_PREV=$B_WRITE
((count++))
done
echo "----- Finished -------------------------------------------------------------------"
여기서 조금 늦을 수도 있지만, 미래의 답변을 찾는 사람들은 도움이 될 수 있습니다.
이것은 나를 괴롭 히고있어서 내가 더러워지고 첫 번째 스크립트를 작성한다고 생각했습니다. 패키지 zenity가 설치되어 있어야하지만 (sudo apt-get install zenity), 아마도 이미있을 것입니다. 또한 wmctrl (윈도우 관리자 컨트롤)을 사용하여 진행률 대화 상자의 제목을 변경하면 쉽게 설치할 수 있지만 그렇지 않으면 차이가 없습니다. 내 패널에서 언제 완료되는지 확인하고 싶습니다.
이 스크립트는 기본적으로 소스 및 대상 디렉토리를 요청하고 du를 사용하여 소스에서 대상의 백분율을 계산하고 진행률 표시 줄을 표시합니다.
참고 : 이것은 완전한 디렉토리 / 파일 동기화 (일반적으로 apt 캐시 백업에 사용)에만 작동하므로 --exclude = / file / in / Source-directory 옵션이 없습니다. 소스 디렉토리에없는 대상 디렉토리에 파일 / 디렉토리가있는 경우에도 작동하지 않습니다. 원격 소스 / 목적지에서 작동하는지 또는 테스트 할 리소스가 없었기 때문에 확실하지 않습니다.
추신. 이 스크립트는 매우 잘못 작성되었거나 매우 비효율적 일 수 있지만 (여기서는 스크립트로 작성) 최소한 스크립트의 목적에 부합하며 물론 필요에 맞게 편집하고 개선 할 수 있습니다. PSS. 또한 rsync를 종료하는 취소 버튼을 얻을 수 없으므로 방금 제거했습니다.
#!/bin/bash
set -e;
WELC="Running RsyncP as $USER";
function echo_progress()
{
while (($TRANSFER_SIZE > 1000));
do
DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1);
((TRANSFER_SIZE=$SOURCE_SIZE-DEST_SIZE));
PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE));
echo $PROGRESS_PERC;
sleep 0.1s;
done;
echo 100;
zenity --info --width=250 --title=RsyncP --text="File syncing complete!";
}
function get_input()
{
dirs=$(zenity --forms --width=500 --title="RsyncP" --text="Enter source And destination directories" --add-entry="Source: " --add-entry="Destination: " --separator=" ");
SOURCE_FOLDER=$(echo $dirs | cut -d' ' -f 1);
DEST_FOLDER=$(echo $dirs | cut -d' ' -f 2);
OPTIONS=-$(zenity --list --title="RsyncP Options" --text="Select rsync options" --separator='' --height=470 --width=470 --checklist --column "activate" --column "Option" --column "Description" FALSE v "Verbose (Terminal only)" FALSE q "Quiet, supress non-error messages (Terminal only)" FALSE P "Progress (Terminal only)" FALSE a "Archive (lrpog)" TRUE r "Recurse into directories" FALSE p "Preserve permissions" FALSE o "Preserve owner" FALSE g "Preserve group" FALSE l "Copy symlinks as symlinks");
zenity --question --no-wrap --title="RsyncP" --width=500 --text="rsync $OPTIONS $SOURCE_FOLDER $DEST_FOLDER\nDo you want to continue?";
SOURCE_SIZE=$(du -s $SOURCE_FOLDER | cut -d / -f 1);
DEST_SIZE=$(du -s $DEST_FOLDER | cut -d / -f 1);
PROGRESS_PERC=$((DEST_SIZE*100/SOURCE_SIZE));
TRANSFER_SIZE=1001;
}
if [ "$(id -u)" != "0" ]; then
zenity --question --title=RsyncP --text="$WELC, Continue?";
get_input;
rsync $OPTIONS $SOURCE_FOLDER $DEST_FOLDER &
echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;
else
zenity --question --title=RsyncP --text="$WELC, Continue?";
get_input;
sudo rsync $OPTIONS $SOURCE_FOLDER $DEST_FOLDER &
echo_progress | zenity --progress --title=RsyncP --no-cancel --auto-close --text="Copying from \n$SOURCE_FOLDER to \n$DEST_FOLDER" ;
fi