systemadmin.es > Script > Indicar el tiempo de sleep

Indicar el tiempo de sleep

El comando sleep es muy utilizado en scripts pero rara vez se utiliza con unidades.

$ time sleep 1.5s

real	0m1.514s
user	0m0.000s
sys	0m0.000s

Dicho comando permite esperar durante los segundos que indiquemos (por defecto), pero también podemos indicarle minutos (m), horas (h) y días (d):

$ sleep 4h

Además, el número no tiene porque ser entero. Por ejemplo, un día y medio:

$ sleep 1.5d

4 comments to “Indicar el tiempo de sleep”

  1. En el ejemplo el sleep de 1.5s tiene un real time de 1.514s en realidad.

    Esto me ha llevado a preguntarme, si por interrupciones E/S, cambios de contexto u otros factores, el kernel tenga que invertir un pequeño overhead (desconozco el motivo real por completo).

    Otra incógnita, es la precisión en coma flotante que pueda llegar a admitir sleep y si aumentando la precisión, se reduce el overhead.

    Por ejemplo, en un simple portatil:

    $ time sleep 1.5s
    
    real	0m1.533s
    user	0m0.000s
    sys	0m0.000s
    
    $ time sleep 1.50s
    
    real	0m1.502s
    user	0m0.000s
    sys	0m0.000s
    
    $ time sleep 1.500s
    
    real	0m1.502s
    user	0m0.000s
    sys	0m0.000s
    
    $ time sleep 1.5000s
    
    real	0m1.516s
    user	0m0.000s
    sys	0m0.000s
    

    Parece ser que aumentando la precisión, por lo general, reduce levemente el overhead, pero los resultados pueden ser meramente circunstanciales, como demuestra el último test.

    Estos pequeños overhead quizás no sean un problema en la mayoría de aplicaciones, pero si creo que es conveniente tenerlos en cuenta si el script de bash necesita de mucha precisión o quizás se se utilizan sleep grandes (1 día o 1 mes) que a larga el overhead de reiteradas ejecuciones sea considerable.

  2. Añadiendo un solo cero al valor que quieres (1,50 para 1,5) parece que es preciso hasta 2 decimales (con resultados consistentes en varias ejecuciones):

    $ time sleep 1.50s
    
    real	0m1.504s
    user	0m0.000s
    sys	0m0.001s
    $ time sleep 1.550s
    
    real	0m1.553s
    user	0m0.001s
    sys	0m0.000s
    $ time sleep 1.5550s
    
    real	0m1.557s
    user	0m0.001s
    sys	0m0.000s
    

    Usa la función nanosleep:

    int
    xnanosleep (double seconds)
    {
      struct timespec ts_sleep = dtotimespec (seconds);
    
      for (;;)
        {
          /* Linux-2.6.8.1's nanosleep returns -1, but doesn't set errno
             when resumed after being suspended.  Earlier versions would
             set errno to EINTR.  nanosleep from linux-2.6.10, as well as
             implementations by (all?) other vendors, doesn't return -1
             in that case;  either it continues sleeping (if time remains)
             or it returns zero (if the wake-up time has passed).  */
          errno = 0;
          if (nanosleep (&ts_sleep, NULL) == 0)
            break;
          if (errno != EINTR && errno != 0)
            return -1;
        }
    
      return 0;
    }
    

    Por lo que debería se tan precisa como esta función sea. Muy interesante el comentario, en mi caso nunca he necesitado este nivel de precisión pero puede resultar útil.

    saludos!

  3. Gracias por la sugerencia Jordi.

    Aunque nanosleep es una función en C, que no forma parte de los scripts para bash como sleep. Dada una necesidad, puede que no sea complicado hacer una simple función en C que tomara un argumento llamando a nanosleep y compilarlo como binario. De esta forma se podrían hacer llamadas como:

    #!/usr/bin/env bash
    
    # Do something
    nanosleep 0.0001
    
    

    Para sistemas críticos o de tiempo real, watchdogs de alta precisión, etc si puede ser útil, aunque normalmente se sacrifica comodidad de bash y se programan directamente en C o incluso ensamblador. Gracias por la entrada, me ha servido para reflexionar un poco 😉

    PD: Por cierto, no llegan notificación de los comentarios por email, entre de nuevo sólo por curiosidad y vi que habías respondido.

  4. En realidad me refiero que es la función que usa sleep para causar el delay.

    Los email no estan activados para no molestar

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>