나는 이를 사용하여 tar
수천 개의 작은 파일을 빠르게 복사하고 pv
파이프를 통해 복사 진행률과 속도를 보여줍니다.
$ sudo tar c --files-from /tmp/camfilenames |
pv --width 40 |
sudo tar x -C /home/pi/test
...이건 잘 작동합니다. 출력 예:
191MiB 0:00:03 [58.1MiB/s] [<=> ]
...터미널에서요. 하지만 이 출력으로 더 많은 작업을 수행하고 싶습니다. 간단한 Python 스크립트가 있습니다 /home/pi/screentest.py
.
import sys
print "start"
for line in sys.stdin:
print "line: " + line
print "end"
테스트 실행:
$ ( sudo tar c --files-from /tmp/camfilenames |
pv --width 40 |
sudo tar x -C /home/pi/test ) |
python /home/pi/screentest.py
산출:
start
191MiB 0:00:03 [55.1MiB/s] [<=> ]
end
버퍼에 있는 모든 것이 반환된다는 것을 알고 있으므로 pv
어떻게 강제로 한 줄씩 뒤로 돌아가서 매번 버퍼를 플러시하여 다음과 같이 출력하도록 할 수 있습니까?
start
line: 0MiB 0:00:00 ...
line: 60MiB 0:00:01 ...
line: 120MiB 0:00:02 ...
line: 191MiB 0:00:03 ...
end
답변1
pv
진행 상황을 stderr로 출력하므로 Python 스크립트에 대한 파이프는 에서 인쇄되지 않습니다 pv
. end
출력이 중지된 후에 인쇄됩니다. 아마도 그때까지 마지막 출력이 종료되어 스크립트의 stdin이 닫혔기 때문일 것입니다.pv
tar
다음과 같은 것이 필요할 수 있습니다.
( sudo tar c --files-from /tmp/camfilenames |
pv --width 40 -f |
sudo tar x -C /home/pi/test ) 2>&1 >/dev/null | python /home/pi/screentest.py
tar 파이프의 stdout을 버리고 대신 stderr을 pythons 스크립트로 보냅니다. stderr이 터미널이 아니면 진행이 없기 때문에 pv
진행 상황을 출력하려면 강제로 수행해야 합니다 .-f
pv
pv
하지만 에 대한 옵션을 확인하고 싶을 수도 있습니다 --format
. 다음과 같은 것을 사용할 수 있습니다.
sudo tar c --files-from /tmp/camfilenames |
pv --width 40 --format $'%b %t\n' |
sudo tar x -C /home/pi/test
비슷한 출력을 얻으려면.
답변2
@muru에게 감사드립니다. 귀하의 솔루션을 시도했지만 동시에 PV가 한 줄을 지속적으로 업데이트하는 대신 새 줄을 출력하도록 강요하는 것이 주요 문제라는 것을 발견했습니다.
그래서 나는 이렇게 썼습니다:
$ tail -f /home/pi/log | pv -f |& stdbuf -oL tr '\r' '\n'
작동했으므로 이제 문제는 각 줄에서 작업을 수행하기 위해 Python 스크립트를 호출하는 방법입니다. do-while 루프를 사용하여 이 작업을 수행할 수 있다는 것을 알았습니다.
$ tail -f /home/pi/log | pv -f |& stdbuf -oL tr '\r' '\n' | (while read -r LINE; do echo $LINE; done;)
그래서 저는 Python 스크립트(작은 LCD 핸들러)를 사용하여 LCD에 PV 상태를 표시합니다.
tail -f /home/pi/log | pv -f --width 20 -i 2 |& stdbuf -oL tr '\r' '\n' | (while read -r LINE; do python /home/pi/screen.py $LINE; done;)
많은 작은 파일을 복사하여 TAR 스크립트를 다시 도입했습니다.
$ (sudo tar c --files-from /tmp/camfilenames | pv -f --width 20 -i 1 | sudo tar x -C /home/pi/test) |& stdbuf -oL tr '\r' '\n' | (while read -r LINE; do python /home/pi/screen.py $LINE; done;)
그래서 결국 PV에 더 많은 매개변수를 추가하고 문자열을 교체하고 PV 출력을 LCD에 보내기 전에 줄 바꿈을 추가했을 때 다음과 같은 결과가 나왔습니다.
cd /home/pi/cam \ && ( \ sudo tar c --files-from /tmp/camfilenames \ | pv -f -s $( \ du -sb /home/pi/cam \ | awk '{print $1}' \ ) --width 64 -i 5 \ | sudo tar x -C /mnt/usb \ ) \ |& stdbuf -oL tr '\r' '\n' \ | ( \ while read -r LINE; \ do LINE="${LINE// /_}"; \ LINE="${LINE//_\[/ [}"; \ LINE="${LINE//\]_/] }"; \ lcd $LINE; \ done; \ ) \ && cd /home/pi