Question Comment puis-je dormir pendant une milliseconde en bash ou en ksh


Le sommeil est une commande très populaire et nous pouvons commencer à dormir à partir de 1 seconde:

# wait one second please 
sleep 1

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

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

105
2018-01-15 13:19


origine


Puis-je demander pourquoi vous voulez dormir pendant 1ms? - Tom O'Connor
Oui bien sûr, dans mon script bash j'ajoute "sleep 1", dans certaines lignes, mais le script s'exécute très lentement, donc après quelques conclusions, je calcule que sleep 0.1 apporte également de bons résultats et plus rapidement À propos du délai, j'ai besoin de délai dans l'ordre pour résoudre le problème ssh dans mon script bash, j’effectue une connexion ssh parallèle à certaines machines en espérant que, sans délai, cela ne fonctionnera pas. Comme vous le savez de ma question, le délai devrait correspondre à Linux et Solaris. - yael
Quelle que soit la solution choisie, gardez à l'esprit qu'un script shell ne sera pas très précis en termes de timing. - scai
Pourquoi ne pas faire quelque chose qui prend très peu de temps à exécuter, mais ne fait rien .. comme echo "" >/dev/null - Tom O'Connor
Bonne idée mais comment msec cette commande prend? , J’ai besoin de 0,1 ms, pas moins que ça - :) - yael


Réponses:


Bash a un sommeil "chargeable" qui prend en charge une fraction 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

Ensuite:

$ 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 objets chargeables ne peuvent pas être fournis avec votre bash binaire, il vous faudra donc les compiler vous-même comme indiqué (bien que sous Solaris, ce ne serait pas nécessairement aussi simple que ci-dessus).

À partir de bash-4.4 (Septembre 2016) tous les objets chargeables sont maintenant construits et installés par défaut sur les plates-formes qui le prennent en charge, bien qu'ils soient générés sous la forme de fichiers à objets partagés séparés et sans .so suffixe. À moins que votre distribution / votre système d’exploitation n’ait fait quelque chose de créatif, vous devriez pouvoir le faire:

[ -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 réglé automatiquement, je trouve que ce n’est pas le cas dans la distribution officielle à partir de 4.4.12. Si et quand il est réglé correctement, vous avez seulement besoin enable -f filename commandname comme demandé.)

Si cela ne vous convient pas, la prochaine chose à faire est de créer ou d’obtenir sleep 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  Est-ce que soutenir des fractions de secondes.

En dernier recours, vous pouvez utiliser perl (ou tout autre script que vous avez sous la main) avec l’avertissement que l’initialisation de l’interprète peut être comparable au temps de sommeil prévu:

$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh

59
2018-01-15 13:52



Ah, puisque tu utilises expect vous pouvez probablement simplement utiliser "after N", où N est millisecondes, directement dans votre script. - mr.spuratic
utilisation usleep comme @Luis Vazquez et @sebix écrivent - Ilan.K


La documentation pour le sleep commande de coreutils dit:

Les mises en œuvre historiques du sommeil ont requis que ce nombre soit un   entier, et n’a accepté qu’un seul argument sans suffixe.   Cependant, GNU sleep accepte des nombres à virgule flottante arbitraires. Voir    Point flottant.

Par conséquent, vous pouvez utiliser sleep 0.1, sleep 1.0e-1 et des arguments similaires.


103
2018-01-15 13:22



voir ma remarque à propos de SOLARIS OS - yael
Avez-vous confondu est et n'est pas? - scai
voir ma mise à jour dans ma quastion - yael
Yael, je pense qu'il y a encore trop de points négatifs dans votre question. Êtes-vous sûr de vouloir dire "syntaxe non illégale"? - MadHatter
par exemple - je cours sur solaris 10 this: # sleep 0.1 sleep: mauvais personnage en argument, à propos de linux sleep 0.1 fonctionne bien - yael


Sleep accepte les nombres décimaux afin que vous puissiez le décomposer comme ceci:

1/2 de seconde

 sleep 0.5

1/100 de seconde

sleep 0.01

Donc, pendant une milliseconde, vous voudriez

sleep 0.001

46
2018-01-15 13:24



Vous pouvez également supprimer le zéro avant le point décimal. par exemple. sleep .5 - Mike Causer
À l'exception de mathforum.org/library/drmath/view/52352.html - stark
Parlez de tous les autres trop compliquer les choses ... - Martin


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 La solution de M. Spuratic et la solution de coles.


11
2018-06-22 19:52





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

usleep 1000

6
2017-07-08 13:55



$ usleep  No command 'usleep' found, did you mean:  Command 'sleep' from package 'coreutils' (main)  usleep: command not found - Bulletmagnet
Non je veux dire usleep partie de la initscripts paquet qui est standard au moins dans toutes les distributions dérivées de Red Hat; comprenant au moins RHEL, CentOS, Fedora, Mageia / Mandriva et SuSE. Voici un exemple: `` `` - Luis Vazquez
Voici un exemple d’illustration exécuté dans CentOS 7: `` `$ usleep / usr / bin / usleep $ rpm -qf / usr / bin / usleep initscripts-9.49.37-1.el7_3.1.x86_64` `` Pour résumer : - sleep (de coreutils) fonctionne avec des secondes - usleep (de Initscripts) fonctionne avec des micro-secondes - Luis Vazquez


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

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

Ne vérifie pas les arguments - je vous en recommanderais un, si vous voulez le conserver, mais que (gcc usleep.c -o usleep) vous sortira d'un trou.


3
2018-05-24 15:12



Vous pourriez au moins changer ce nu usleep() appeler pour if(argc == 1) { usleep(atoi(argv[1])); } pour éviter l'indexation en dehors des limites du tableau, ce qui peut entraîner un certain nombre de comportements inattendus. - α CVn