有没有办法控制 /dev/urandom 的速度
例如,我有这样的二进制序列生成器:
grep -ao "[01]" /dev/urandom|tr -d \\n
我需要让它更慢,每秒 100 个符号,每秒 1000 个符号。
有没有办法控制 /dev/urandom 的速度
例如,我有这样的二进制序列生成器:
grep -ao "[01]" /dev/urandom|tr -d \\n
我需要让它更慢,每秒 100 个符号,每秒 1000 个符号。
您可以使用pv
(除其他外)限制来自管道的数据:
grep -ao "[01]" /dev/urandom | tr -d \\n | pv -q -L 100
在这里,我-L
在“限制”中使用 as 来获得每秒最多 100 字节的输出速率。在-q
那里可以抑制来自pv
. 对于每秒 1000 字节,您可以使用-L 1000
or-L 1k
代替。
如果你有 perl,例如可以制作一个小脚本,例如cps.pl
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw(usleep);
local $|=1;
while(<>) {
chomp;
print $_;
usleep(100000);
}
并运行:
grep -ao "[01]" /dev/urandom | perl cps.pl
玩睡眠时间以获得正确的速度。也许也想用 perl 实现 grep 部分。
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw( usleep);
open my $rfd, "<:raw", "/dev/urandom" or die "$!";
my $buff;
local $|=1;
while() {
read ($rfd, $buff, 1);
next unless $buff =~ /[01]/;
usleep(10000);
print $buff;
}
close $rfd;
并简单地运行perl cps.pl
补充: 如果您不需要加密安全的随机数,您可以使用下一个单行:
perl -MTime::HiRes -e '$|=1;while(1){print int(rand(2)); Time::HiRes::usleep(10000)}'
这可能会因处理器而异,但尝试起来很有趣
#!/bin/bash
microsleep ()
{
for (( y=0; y<$1*50; y++ ))
do
:
done
}
tr -cd 01 </dev/urandom | while read -n1 b
do
printf $b
microsleep 1
done
结果
$ timeout 1 microsleep.sh > log
$ stat -c%s log
1011