GNU 시스템에서을 가지고 있다면 다음을 pv
수행 할 수 있습니다.
cmd='
that command | to execute &&
as shell code'
yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
은 -P20
대부분 20에서 실행하는 $cmd
동시에.
-L10
속도를 초당 10 바이트로 제한하므로 초당 5 행입니다.
귀하의 경우 $cmd
의 느린 두되고 도달 할 20 한계가 발생하고 xargs
한 때까지 읽기 중지됩니다 $cmd
적어도 반환의 인스턴스입니다. pv
파이프가 가득 찰 때까지 동일한 속도로 파이프에 계속 쓰기를 수행합니다 (기본 파이프 크기가 64KiB 인 Linux에서는 거의 2 시간이 걸립니다).
그 시점에서 pv
쓰기를 중지합니다. 그러나 그 후에도 xargs
읽기를 다시 시작할 때 pv
초당 평균 5 줄을 유지하기 위해 가능한 빨리 빨리 보내야하는 모든 줄을 잡아서 보내려고합니다.
즉, 20 개의 프로세스가 평균 요구 사항에서 초당 5 회 실행을 충족 할 수있는 한 가능합니다. 그러나 한계에 도달하면 새 프로세스가 시작되는 속도는 pv의 타이머가 아니라 이전 cmd 인스턴스가 리턴하는 속도에 의해 결정됩니다. 예를 들어, 20 개가 현재 실행 중이고 10 초 동안 있고 그 중 10 개가 동시에 모두 완료하기로 결정한 경우 한 번에 10 개의 새로운 항목이 시작됩니다.
예:
$ cmd='date +%T.%N; exec sleep 2'
$ yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
09:49:23.347013486
09:49:23.527446830
09:49:23.707591664
09:49:23.888182485
09:49:24.068257018
09:49:24.338570865
09:49:24.518963491
09:49:24.699206647
09:49:24.879722328
09:49:25.149988152
09:49:25.330095169
두 실행 사이의 지연이 항상 정확히 0.2 초가 아니더라도 평균적으로 초당 5 회입니다.
with ksh93
(또는 명령이 소수 초를 지원 하는 zsh
경우 sleep
) :
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
your-command
그러나 동시 수에는 제한이 없습니다 .