echo 'echo "hello, world!";sleep 3;' | parallel
이 명령은 완료될 때까지 아무것도 출력하지 않습니다. Parallel의 매뉴얼 페이지에는 다음과 같이 명시되어 있습니다.
GNU 병렬 처리는 명령의 출력이 명령을 순차적으로 실행했을 때 얻을 수 있는 것과 동일하도록 보장합니다.
나는 악마가 표현에 있다고 생각합니다. 정상적으로 실행하는 것과 동일한 출력을 얻을 수 있지만 정상적으로 실행하는 것과 동일한 출력을 얻지는 못할 것입니다. 예를 들어, 저는 이 작업을 수행할 수 있는 옵션을 찾고 있었지만 --results /dev/stdout
작동하지 않습니다.
내 사용 사례는 실행 중인 명령의 실시간 진행 상황 출력을 확인하는 것입니다. 얼마나 많은 작업이 완료되었는지, 어떤 병렬 작업이 나에게 표시될 수 있는지가 아니라 내가 보고 싶은 각 명령의 진행률 출력에 관한 것입니다.
나는 bash 루프( for i in $x; do cmd & done;
)를 사용하겠지만 Ctrl+C 한 번으로 모든 작업을 중지할 수 있기를 원하며 병렬 처리를 통해 그렇게 할 수 있습니다.
이 작업을 병렬로 수행할 수 있습니까? 그렇지 않다면 다른 도구가 있습니까?
답변1
나는 당신이 찾고 있다고 생각합니다 --ungroup
. 매뉴얼 페이지에는 다음과 같이 나와 있습니다.
--group Group output. Output from each jobs is grouped
together and is only printed when the command is finished.
--group is the default. Can be reversed with -u.
-u
물론 의 동의어입니다 --ungroup
.
답변2
일부 병렬 작업의 진행 상황을 보려면 다음을 시도하십시오 --tmuxpane --fg
.
parallel --tmuxpane --fg seq {} 10000000 ::: {1..100}
-u
또는 (가능성이 더 높음) 을 찾고 있을 수도 있습니다 --lb
. 에서 man parallel
:
--line-buffer
--lb
Buffer output on line basis. --group will keep the output together
for a whole job. --ungroup allows output to mixup with half a line
coming from one job and half a line coming from another job.
--line-buffer fits between these two: GNU parallel will print a full
line, but will allow for mixing lines of different jobs.
--line-buffer takes more CPU power than both --group and --ungroup,
but can be much faster than --group if the CPU is not the limiting
factor.
Normally --line-buffer does not buffer on disk, and can thus process
an infinite amount of data, but it will buffer on disk when combined
with: --keep-order, --results, --compress, and --files. This will
make it as slow as --group and will limit output to the available
disk space.
With --keep-order --line-buffer will output lines from the first job
while it is running, then lines from the second job while that is
running. It will buffer full lines, but jobs will not mix. Compare:
parallel -j0 'echo {};sleep {};echo {}' ::: 1 3 2 4
parallel -j0 --lb 'echo {};sleep {};echo {}' ::: 1 3 2 4
parallel -j0 -k --lb 'echo {};sleep {};echo {}' ::: 1 3 2 4
See also: --group --ungroup
[...]
--ungroup
-u Ungroup output. Output is printed as soon as possible and by passes
GNU parallel internal processing. This may cause output from
different commands to be mixed thus should only be used if you do not
care about the output. Compare these:
seq 4 | parallel -j0 \
'sleep {};echo -n start{};sleep {};echo {}end'
seq 4 | parallel -u -j0 \
'sleep {};echo -n start{};sleep {};echo {}end'
It also disables --tag. GNU parallel outputs faster with -u. Compare
the speeds of these:
parallel seq ::: 300000000 >/dev/null
parallel -u seq ::: 300000000 >/dev/null
parallel --line-buffer seq ::: 300000000 >/dev/null
Can be reversed with --group.
See also: --line-buffer --group
빛나는 예 -u
는 stdout과 stderr이 같은 줄에 혼합되어 있는 것입니다.
echo -n 'This is stdout (';echo -n stderr >&2 ; echo ')'
--lb
및 를 사용하면 형식이 잘못됩니다 --group
.
-u
그러나 프로세스 간의 절반 라인 혼합으로 인해 형식이 올바르게 지정된다는 보장도 없습니다.http://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P
다음을 시도해 볼 수도 있습니다. --latest-line 은 각 작업에 대해 화면에 한 줄을 유지하고 거기에 최신 줄을 인쇄합니다.
답변3
내 솔루션은 출력을 파일에 기록하고 명령을 사용하여 실시간으로 변경 사항을 확인한 다음 tail -f <file>
작업이 완료되면 자동으로 삭제하는 것이었습니다. 플래그 도 유용하다고 생각합니다 --progress
.
parallel --progress ./program {} '>' {}.log';' rm {}.log ::: A B C
여기의 작업은 program
다양한 입력으로 실행 A
하고 프로그램의 출력을 적절한 로그 파일로 B
보내는 것으로 구성됩니다.C