~처럼GNU 병렬 매뉴얼표시하려면 병렬 zenity 진행률 표시줄을 사용할 수 있습니다.
seq 1000 | parallel -j30 --bar '(echo {};sleep 0.1)' \
2> >(zenity --progress --auto-kill) | wc
그러나 이 예에서는 취소 버튼이 작동하지 않습니다. 나는 그것에 대해 읽었습니다유제보다 일반적으로 사용되는 명령(예: 비병렬)을 사용할 때 이 버튼을 사용하십시오.취소 버튼 작동 방식에 대한 추가 정보하지만 그것은 나에게 별로 도움이 되지 않았습니다. 병렬은 완전히 다른 방식으로 사용하는 것 같고 프로세스를 중지하기 위해 취소 버튼을 얻는 방법을 모르겠습니다.
나는 주로 2> >
and 에 대해 혼란스러워 합니다 wc
. |
Fast 를 사용하면
첨부된:알려드리자면, 병행 메일링 리스트에서 이 문제에 대해 이야기한 적이 있습니다.
답변1
Zenity는 두 줄을 읽도록 설계되었습니다. 하나는 진행률 표시줄이고 다른 하나는 "#"으로 시작하는 진행 텍스트입니다.
for ((i=0;i<=100;i++));do
echo "$i" # bar
echo "#percent done $i" # text
sleep .1
done
| zenity --progress
그럴 수도 있을 것 같아요- 술집stderr에 진행 상황을 기록하지만 닫지 않거나 줄 끝에 개행 문자를 기록하는 옵션입니다. 이로 인해 새로운 라인을 기대하던 Zenity가 중단되었습니다. 해결 방법은 기본적으로 파일 설명자 2인 stderr에 개행 문자를 인쇄하는 것입니다.
seq 1000 | parallel -j30 --bar '(echo {}; echo >&2; sleep 0.1)' \
2> >(zenity --progress --auto-kill) | wc
답변2
그래서 분명히 zenity
개행 문자가 작업을 취소하기를 원합니다.
출력에서 GNU Parallel을 --bar
사용하면 \r
의 진행률 표시줄에서는 훌륭하게 작동 zenity
하지만 놀랍게도 "취소" 버튼에서는 작동하지 않습니다.
따라서 확실한 해결책은 취소 버튼이 필요한 경우 버튼을 제공하기 전에 다음 \r
으로 바꾸는 것입니다.\n
zenity
seq 1000 |
parallel -j30 --bar '(echo {}; sleep 0.1)' 2> >(perl -pe 'BEGIN{$/="\r";$|=1};s/\r/\n/g' |
zenity --progress --auto-kill) |
wc
strace
덜 분명한 해결책은 결코 일어나지 않는 일을 사용하고 추적하는 것입니다 .
seq 1000 |
parallel -j30 --bar '(echo {};sleep 0.1)' 2> >(strace -e trace=creat zenity --progress --auto-kill) |
wc
strace
왜 이런 일이 일어나는지 전혀 모르겠습니다 .