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?
sleep 0.XXX
fonctionne bien, mais sur Solaris sleep 0.1
ou sleep 0.01
- syntaxe illégaleBash 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
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.
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
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 .
Vous pouvez simplement utiliser usleep
. Cela prend des microsecondes (= 1e-6 secondes) comme paramètre, donc pour dormir 1 milliseconde vous entrez:
usleep 1000
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.
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/ .