Na minha máquina, preciso executar um ciclo que itere 1 comando simples que deve ter um atraso expresso em frações de segundo.
Digamos que eu preciso:
- para salvar um arquivo com uma crescente enumeração (arquivo-0, arquivo-1, arquivo-2, ...) gerado por algo trivial para este exemplo como
time > file-$x
- Eu preciso fazer isso a cada 1/70 de segundo (como exemplo), porque gostaria de expressar meu tempo com frações de segundo.
Como posso ser realmente preciso e ter tudo expresso com um script bash?
A fração pode gerar uma quantidade indeterminável, preciso ser preciso e preciso de pelo menos 4-5 casas decimais.
Talvez você possa simplesmente correr
?
na minha
archlinux
distribuição:fonte
sleep
permite frações? você pode oferecer um exemplo completo com um loop falso?Gerar um processo e carregar um novo executável provavelmente leva alguns milissegundos, para que esse tipo de precisão realmente não faça sentido. Observe também que o tempo de CPU em muitos sistemas é alocado para processos por fatias de até 10ms.
Dito isto, algumas
sleep
implementações levam números fracionários de segundos, e o zsh e o ksh93 podem tornar sua$SECONDS
variável especial fracionáriatypeset -F SECONDS
.Exemplo (zsh):
Opa, ele flutuou. Você pode ajustar o tempo de sono com base em
$SECONDS
:Aqueles 2 milisegundos extras são, provavelmente, a ser contabilizado para executar a última
sleep
edate
comandos.Observe também que o zsh possui um
zselect
tempo limite expresso em centésimos de segundo. E o ksh93 foisleep
incorporado (e aceita pontos flutuantes) eprintf
pode imprimir data / hora.Se você quiser algo mais preciso, provavelmente desejará um sistema operacional em tempo real ou um sistema operacional com recursos em tempo real e certamente não usará um shell.
fonte
sleep 1/70
não é permitido na minha máquina ...Se o seu shell
sleep
não aceita fração, use perl.Se você precisar descobrir a fração, use
echo "scale=5; 1/70" | bc
fonte
No Alpine Linux (Busybox), você pode fazer um loop por microssegundos com
usleep 10
(equivalente a0.00001
um segundo)GNU sleep
suporta frações de segundo:sleep 0.00001
fonte