Pada sistem GNU dan jika sudah pv
, Anda dapat melakukannya:
cmd='
that command | to execute &&
as shell code'
yes | pv -qL10 | xargs -n1 -P20 sh -c "$cmd" sh
The -P20
adalah untuk mengeksekusi paling 20 $cmd
pada waktu yang sama.
-L10
membatasi laju hingga 10 byte per detik, jadi 5 baris per detik.
Jika Anda $cmd
menjadi dua lambat dan menyebabkan batas 20 tercapai, maka xargs
akan berhenti membaca sampai satu $cmd
contoh setidaknya kembali. pv
masih akan terus menulis ke pipa pada kecepatan yang sama, sampai pipa menjadi penuh (yang pada Linux dengan ukuran pipa default 64KiB akan memakan waktu hampir 2 jam).
Pada saat itu, pv
akan berhenti menulis. Tetapi meskipun demikian, ketika xargs
resume membaca, pv
akan mencoba dan mengejar dan mengirim semua baris yang seharusnya telah dikirim sebelumnya secepat mungkin sehingga mempertahankan rata-rata 5 baris per detik secara keseluruhan.
Apa itu artinya bahwa selama mungkin dengan 20 proses untuk memenuhi 5 run per detik pada persyaratan rata-rata, itu akan melakukannya. Namun ketika batas tercapai, laju di mana proses baru dimulai tidak akan didorong oleh timer pv tetapi oleh tingkat di mana contoh cmd sebelumnya kembali. Misalnya, jika 20 saat ini sedang berjalan dan telah selama 10 detik, dan 10 dari mereka memutuskan untuk menyelesaikan semuanya pada saat yang sama, maka 10 yang baru akan dimulai sekaligus.
Contoh:
$ 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
Rata-rata, itu akan menjadi 5 kali per detik bahkan jika penundaan antara dua berjalan tidak selalu tepat 0,2 detik.
Dengan ksh93
(atau dengan zsh
jika sleep
perintah Anda mendukung pecahan detik):
typeset -F SECONDS=0
n=0; while true; do
your-command &
sleep "$((++n * 0.2 - SECONDS))"
done
Itu tidak membatasi jumlah konkuren your-command
.