Solución 1:
La documentación para el sleep
comando de coreutils dice:
Las implementaciones históricas de sleep han requerido que el número sea un número entero, y solo aceptan un único argumento sin un sufijo. Sin embargo, GNU sleep acepta números de punto flotante arbitrarios. Ver Punto flotante.
Por lo tanto, puede usar sleep 0.1
, sleep 1.0e-1
y argumentos similares.
Solución 2:
Bash tiene una suspensión "cargable" que admite fracciones de segundo y elimina los gastos generales de un comando externo:
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
Entonces:
$ which sleep
/usr/bin/sleep
$ builtin sleep
sleep: usage: sleep seconds[.fraction]
$ time (for f in `seq 1 10`; do builtin sleep 0.1; done)
real 0m1.000s
user 0m0.004s
sys 0m0.004s
La desventaja es que es posible que los cargables no se proporcionen con su bash
binario, por lo que deberá compilarlos usted mismo como se muestra (aunque en Solaris no sería necesariamente tan simple como arriba).
A partir del bash-4.4
(septiembre de 2016) todos los cargables ahora se compilan e instalan de forma predeterminada en las plataformas que lo admiten, aunque se compilan como archivos de objetos compartidos separados y sin un .so
sufijo. A menos que su distribución/SO haya hecho algo creativo (lamentablemente, RHEL/CentOS 8 build bash-4.4
con extensiones cargables deliberadamente eliminado), debería poder hacer en su lugar:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(La página man implica BASH_LOADABLES_PATH
se configura automáticamente, encuentro que este no es el caso en la distribución oficial a partir de 4.4.12. Si y cuando está configurado correctamente, solo necesita enable -f filename commandname
según sea necesario).
Si eso no es adecuado, lo siguiente más fácil es compilar u obtener sleep
de GNU coreutils, esto es compatible con la característica requerida. El POSIX sleep
El comando es mínimo, las versiones anteriores de Solaris solo implementaron eso. Solaris 11 sleep
lo hace admiten fracciones de segundo.
Como último recurso, podría usar perl
(o cualquier otra secuencia de comandos que tenga a mano) con la advertencia de que la inicialización del intérprete puede ser comparable al tiempo de suspensión previsto:
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
Solución 3:
Sleep acepta números decimales para que puedas desglosarlos así:
1/2 de segundo
sleep 0.5
1/100 de segundo
sleep 0.01
Así que por un milisegundo querrías
sleep 0.001
Solución 4:
Prueba esto para determinar la precisión:
time sleep 0.5 # 500 milliseconds (1/2 of a second)
time sleep 0.001 # 1 millisecond (1/1000 of a second)
time sleep 1.0 # 1 second (1000 milliseconds)
Combinación de solución de mr.spuratic y solución de coles.
Solución 5:
Simplemente puede usar usleep
. Toma microsegundos (=1e-6 segundos) como parámetro, por lo que para dormir 1 milisegundo ingresaría:
usleep 1000