web-dev-qa-db-fra.com

Comment dormir une milliseconde en bash ou ksh

sleep est une commande très populaire et nous pouvons commencer à dormir à partir d'une seconde:

# wait one second please 
sleep 1

mais quelle est l'alternative si je dois attendre seulement 0,1 seconde ou entre 0,1 à 1 seconde?

  • remarque: sous linux ou OS X sleep 0.XXX fonctionne bien, mais sur Solaris sleep 0.1 ou sleep 0.01 - syntaxe illégale
142
yael

Bash a un sommeil "chargeable" qui prend en charge les fractions de seconde et élimine les frais généraux d'une commande externe:

$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep

Alors:

$ 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

L'inconvénient est que les chargeables peuvent ne pas être fournies avec votre binaire bash, vous devrez donc les compiler vous-même comme indiqué (bien que sous Solaris ce ne soit pas nécessairement aussi simple que ci-dessus).

À partir du bash-4.4 (septembre 2016) tous les chargeables sont désormais construits et installés par défaut sur les plates-formes qui le prennent en charge, bien qu'ils soient construits en tant que fichiers d'objets partagés séparés, et sans .so suffixe. À moins que votre distribution/OS n'ait fait quelque chose de créatif (malheureusement, RHEL/CentOS 8 build bash-4.4 avec les extensions chargeables délibérément supprimé), vous devriez pouvoir faire à la place:

[ -z "$BASH_LOADABLES_PATH" ] &&
  BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)  
enable -f sleep sleep

(La page de manuel implique BASH_LOADABLES_PATH est défini automatiquement, je trouve que ce n'est pas le cas dans la distribution officielle au 4.4.12. Si et quand il est correctement défini, vous n'avez besoin que de enable -f filename commandname comme demandé.)

Si cela ne convient pas, la prochaine chose la plus simple à faire est de construire ou d'obtenir sleep à partir de GNU coreutils, cela prend en charge la fonctionnalité requise. Le POSIX sleep la commande est minimale, les anciennes versions de Solaris ne l'implémentaient que. Solaris 11 sleep le fait prend en charge les fractions de seconde.

En dernier recours, vous pouvez utiliser Perl (ou tout autre script que vous avez à portée de main) avec la mise en garde que l'initialisation de l'interpréteur peut être comparable au temps de sommeil prévu:

$ Perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
71
mr.spuratic

La documentation de la commande sleep de coreutils dit:

Les implémentations historiques de sleep ont exigé que ce nombre soit un entier et n'acceptent qu'un seul argument sans suffixe. Cependant, GNU sleep accepte des nombres à virgule flottante arbitraires. Voir virgule flottante .

Vous pouvez donc utiliser sleep 0.1, sleep 1.0e-1 et arguments similaires.

136
scai

Le mode veille accepte les nombres décimaux, vous pouvez donc le répartir comme suit:

1/2 de seconde

 sleep 0.5

1/100 de seconde

sleep 0.01

Donc, pendant une milliseconde, vous voudriez

sleep 0.001
64
colealtdelete

Essayez ceci pour déterminer la précision:

    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)

Combinaison de solution de mr.spuratic et solution de coles .

12
dsrdakota

Vous pouvez simplement utiliser usleep. Cela prend des microsecondes (= 1e-6 secondes) comme paramètre, donc pour dormir 1 milliseconde vous entrez:

usleep 1000
8
Luis Vazquez

J'ai eu le même problème (pas de shell Shell sur Solaris) alors j'ai écrit le mien ainsi:

  #include "stdio.h"
  int main(int argc, char **argv) {
     if(argc == 2) { usleep(atoi(argv[1])); }
     return 0;
}

Ne vérifie pas les arguments - je recommanderais un écrit correctement si vous voulez le garder mais cela (gcc usleep.c -o usleep) vous sortira d'un trou.

5
jrichemont

J'aime l'idée de sommeil, mais je ne peux pas faire de commentaire en dessous. Depuis que cela m'a aidé, j'espère que ma suggestion peut améliorer l'idée de sommeil.

https://github.com/Fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c est le code source réel pour usleep.c sur l'écosystème de redhat.

Essayez de compiler cela dans votre Solaris. Vous auriez probablement besoin de https://www.opencsw.org/packages/libpopt0/ .

0
edzzz