スリープは非常に人気のあるコマンドであり、1秒からスリープを開始できます。
# wait one second please
sleep 1
しかし、0.1秒だけ、または0.1〜1秒待つ必要がある場合はどうすればよいでしょうか。
- 注意:LinuxまたはOS Xでは
sleep 0.XXX
正常に動作しますが、solarissleep 0.1
またはsleep 0.01
-不正な構文では
echo "" >/dev/null
スリープは非常に人気のあるコマンドであり、1秒からスリープを開始できます。
# wait one second please
sleep 1
しかし、0.1秒だけ、または0.1〜1秒待つ必要がある場合はどうすればよいでしょうか。
sleep 0.XXX
正常に動作しますが、solaris sleep 0.1
またはsleep 0.01
-不正な構文ではecho "" >/dev/null
回答:
Bashには秒の小数部をサポートする「ロード可能な」スリープがあり、外部コマンドのオーバーヘッドを排除します。
$ cd bash-3.2.48/examples/loadables
$ make sleep && mv sleep sleep.so
$ enable -f sleep.so sleep
次に:
$ 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
マイナス面は、ロード可能ファイルがbash
バイナリで提供されない可能性があるため、示されているように自分でコンパイルする必要があることです(ただし、Solarisでは必ずしも上記のように単純ではありません)。
とおりbash-4.4
(2016年9月)のすべてのloadablesは現在構築されており、それらは別々の共有オブジェクト・ファイルとして構築されていても、それをサポートするプラットフォームにデフォルトでインストール、およびなしの.so
サフィックス。ディストリビューション/ OSが何か創造的なことをしていない限り、代わりにできるはずです:
[ -z "$BASH_LOADABLES_PATH" ] &&
BASH_LOADABLES_PATH=$(pkg-config bash --variable=loadablesdir 2>/dev/null)
enable -f sleep sleep
(manページBASH_LOADABLES_PATH
は自動的に設定されることを意味しますが、4.4.12の時点では公式のディストリビューションには当てはまりません。正しく設定されている場合はenable -f filename commandname
、必要な場合にのみ必要です。)
それが適切でない場合、次に行う最も簡単なことは、ビルドまたはsleep
GNU coreutilsから取得することです。これにより、必要な機能がサポートされます。POSIX sleep
コマンドは最小限であり、古いバージョンのSolarisのみが実装されています。Solaris 11 sleep
は小数秒をサポートします。
最後の手段として、perl
インタープリターを初期化することは意図したスリープ時間に匹敵する可能性があるという警告とともに使用することができます(または他のスクリプトを使用する必要があります)。
$ perl -e "select(undef,undef,undef,0.1);"
$ echo "after 100" | tclsh
expect
使用after N
しているので、スクリプトで直接" "(Nはミリ秒)を使用できます。
usleep
@Luisバスケスと@sebixの書き込みのように
coreutilsのsleep
コマンドのドキュメントには次のように記載されています。
スリープの歴史的な実装では、数値が整数であることが必要であり、接尾辞のない単一の引数のみを受け入れました。ただし、GNUスリープは任意の浮動小数点数を受け入れます。浮動小数点を参照してください 。
したがって、あなたは使用することができsleep 0.1
、sleep 1.0e-1
および同様の議論。
スリープは10進数を受け入れるため、次のように分類できます。
1/2秒
sleep 0.5
1/100秒
sleep 0.01
ミリ秒の間、あなたは望むでしょう
sleep 0.001
sleep .5
これを試して精度を確認してください。
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)
mr.spuraticの解とcolesの解の組み合わせ。
単に使用できますusleep
。パラメーターとしてマイクロ秒(= 1e-6秒)を要するため、1ミリ秒スリープするには次のように入力します。
usleep 1000
$ usleep
No command 'usleep' found, did you mean:
Command 'sleep' from package 'coreutils' (main)
usleep: command not found
usleep
あるinitscripts
パッケージの一部を意味します。少なくともRHEL、CentOS、Fedora、Mageia / Mandriva、SuSEを含む。ここに例: `` ``
sleep
(からのcoreutils - )秒で動作しますusleep
(からinitscriptsの)マイクロ秒で動作します
私は同じ問題を抱えていました(Solarisではシェルがスリープしていません)。
#include "stdio.h"
int main(int argc, char **argv) {
if(argc == 2) { usleep(atoi(argv[1])); }
return 0;
}
引数をチェックしません-あなたがそれを保持したい場合、適切に書かれたものをお勧めしますが、それ(gcc usleep.c -o usleep)はあなたを穴から追い出します。
usleep()
コールには、if(argc == 1) { usleep(atoi(argv[1])); }
予期しない動作の任意の数につながる可能配列の境界の外のインデックスを避けるために。
if (argc == 2) { usleep(atoi(argv[1])); }
...
usleep
単位はμsであるため、1秒待機するには1000000引数を指定する必要があります。
atoi()
文字列をに変換するという恐ろしい選択int
です。何がatoi( "STRING" )
戻りますか?atoi()
エラーを返す方法はありません。
私はusleepのアイデアが好きですが、その下でコメントすることはできません。これが私を助けてくれたので、私の提案がusleepのアイデアを改善できることを願っています。
https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.cは、redhatエコシステム上のusleep.cの実際のソースコードです。
Solarisでコンパイルしてみてください。おそらくhttps://www.opencsw.org/packages/libpopt0/が必要でしょう。