GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo duermo por un milisegundo en bash o ksh?

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

Linux
  1. ¿Cómo depurar un script Bash?

  2. ¿Cómo obtener la finalización de Bash para alias de comando?

  3. ¿Cómo crear un entorno de carcasa limpia para uso temporal?

  4. ¿Cómo detectar Bash> =4.0?

  5. ¿Cómo ejecuto múltiples comandos en segundo plano en bash en una sola línea?

Cómo escribir un bucle en Bash

Cómo comentar en Bash

Golpe para bucle

Cómo usar bash if -z y if -n para probar cadenas en Linux

Shell Scripting para principiantes:cómo escribir Bash Scripts en Linux

Cómo ejecutar un script Bash