sleep ist ein sehr beliebter Befehl und wir können den Schlaf ab 1 Sekunde starten:
# wait one second please
sleep 1
aber was ist die Alternative, wenn ich nur 0,1 Sekunden oder zwischen 0,1 bis 1 Sekunde warten muss?
- Bemerkung: unter Linux oder OS X
sleep 0.XXX
funktioniert es gut, aber unter Solarissleep 0.1
odersleep 0.01
- illegaler Syntax
echo "" >/dev/null
Antworten:
Bash verfügt über einen "ladbaren" Ruhezustand, der Sekundenbruchteile unterstützt und den Overhead eines externen Befehls eliminiert:
Dann:
Der Nachteil ist, dass die Loadables möglicherweise nicht mit Ihrer
bash
Binärdatei geliefert werden. Sie müssten sie daher wie gezeigt selbst kompilieren (unter Solaris ist dies jedoch nicht unbedingt so einfach wie oben beschrieben).Ab
bash-4.4
(September 2016) werden alle Loadables standardmäßig auf Plattformen erstellt und installiert, die dies unterstützen. Sie werden jedoch als separate Shared Object-Dateien ohne.so
Suffix erstellt. Sofern Ihre Distribution / Ihr Betriebssystem nichts Kreatives geleistet hat, sollten Sie stattdessen Folgendes tun können:(Die Manpage impliziert
BASH_LOADABLES_PATH
, dass sie automatisch gesetzt wird. Ich finde, dass dies in der offiziellen Distribution ab 4.4.12 nicht der Fall ist. Wenn und wann sie richtig gesetzt ist, brauchen Sie nurenable -f filename commandname
die erforderlichen Einstellungen .)Wenn dies nicht geeignet ist, ist es am einfachsten,
sleep
GNU-Coreutils zu erstellen oder von diesen zu beziehen. Dies unterstützt die erforderliche Funktion. Der POSIX-sleep
Befehl ist minimal, ältere Solaris-Versionen haben nur diesen implementiert. Solaris 11sleep
tut Sekundenbruchteile unterstützen.Als letzten Ausweg können Sie
perl
(oder jedes andere Skript, das Sie zur Hand haben) mit der Einschränkung verwenden, dass das Initialisieren des Interpreters möglicherweise mit der beabsichtigten Ruhezeit vergleichbar ist:quelle
expect
, können Sie wahrscheinlich einfach "after N
", wobei N Millisekunden ist, direkt in Ihrem Skript verwenden.usleep
wie @ Luis Vazquez und @ Sebix schreibenIn der Dokumentation zum
sleep
Befehl von coreutils heißt es:Somit können Sie verwenden
sleep 0.1
,sleep 1.0e-1
und ähnliche Argumente.quelle
Sleep akzeptiert Dezimalzahlen, so dass Sie diese wie folgt aufteilen können:
1/2 Sekunde
1/100 Sekunde
Also für eine Millisekunde würden Sie wollen
quelle
sleep .5
Versuchen Sie dies, um die Genauigkeit zu bestimmen:
Kombination der Lösung von mr.spuratic und der Lösung von coles .
quelle
Sie können einfach verwenden
usleep
. Es dauert Mikrosekunden (= 1e-6 Sekunden) als Parameter, sodass Sie für den Ruhezustand 1 Millisekunde eingeben würden:quelle
$ usleep
No command 'usleep' found, did you mean:
Command 'sleep' from package 'coreutils' (main)
usleep: command not found
usleep
Teil desinitscripts
Pakets, der zumindest in allen von Red Hat abgeleiteten Distributionen Standard ist. einschließlich mindestens RHEL, CentOS, Fedora, Mageia / Mandriva und SuSE. Hier ein Beispiel: `` `sleep
(von coreutils ) arbeitet mit Sekunden -usleep
(von initscripts ) arbeitet mit MikrosekundenIch hatte das gleiche Problem (kein Shell-Usleep unter Solaris), also schrieb ich mein eigenes so:
Überprüft keine Argumente - ich empfehle ein richtig geschriebenes, wenn Sie es behalten möchten, aber das (gcc usleep.c -o usleep) wird Sie aus einem Loch herausholen.
quelle
usleep()
if(argc == 1) { usleep(atoi(argv[1])); }
if (argc == 2) { usleep(atoi(argv[1])); }
...usleep
Einheit μs ist. Wenn Sie also 1 Sekunde warten möchten, müssen Sie ein 1000000-Argument eingeben.atoi()
ist eine schreckliche Wahl, um eine Zeichenfolge in eine umzuwandelnint
. Was kehrtatoi( "STRING" )
zurück?atoi()
kann keinen Fehler zurückgeben.Ich mag die Idee des Einschlafens, kann aber keinen Kommentar dazu abgeben. Da dies mir geholfen hat, hoffe ich, dass mein Vorschlag die Idee des Einschlafens verbessern kann.
https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.c ist der eigentliche Quellcode für usleep.c auf dem Redhat-Ökosystem.
Versuchen Sie, dies in Ihrem Solaris zu kompilieren. Sie benötigen wahrscheinlich https://www.opencsw.org/packages/libpopt0/ .
quelle