bashまたはkshで1ミリ秒間スリープする方法


128

スリープは非常に人気のあるコマンドであり、1秒からスリープを開始できます。

# wait one second please 
sleep 1

しかし、0.1秒だけ、または0.1〜1秒待つ必要がある場合はどうすればよいでしょうか。

  • 注意:LinuxまたはOS Xではsleep 0.XXX正常に動作しますが、solaris sleep 0.1またはsleep 0.01-不正な構文では

2
なぜ1ミリ秒間スリープしたいのか尋ねることはできますか?
トム・オコナー

1
もちろん、bashスクリプトでは、いくつかの行に「sleep 1」を追加しますが、スクリプトの実行は非常に遅いため、いくつかの結論の後、sleep 0.1でも良い結果が得られ、より速くなると計算します私のbashスクリプトのssh問題を解決するために、私は期待していくつかのマシンにパラレルsshログインを実行し、遅滞なく機能しません。私の質問からわかるように、遅延はLinuxとSolarisの両方に適合するはず
です-yael

3
どのソリューションを選択したとしても、シェルスクリプトはタイミングに関してあまり正確ではないことに注意してください。
scai

どのように実行するために非常に短い時間がかかりますが、何もしない何かをして...のような程度echo "" >/dev/null
トム・オコナー

良いアイデアですが、このコマンドはどれくらいのミリ秒かかりますか?、私は0.1ミリ秒が必要です、それ以上ではありません-:)
yael

回答:


68

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、必要な場合にのみ必要です。)

それが適切でない場合、次に行う最も簡単なことは、ビルドまたはsleepGNU coreutilsから取得することです。これにより、必要な機能がサポートされます。POSIX sleepコマンドは最小限であり、古いバージョンのSolarisのみが実装されています。Solaris 11 sleep 小数秒をサポートします。

最後の手段として、perlインタープリターを初期化することは意図したスリープ時間に匹敵する可能性があるという警告とともに使用することができます(または他のスクリプトを使用する必要があります)。

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

2
ああ、expect使用after Nしているので、スクリプトで直接" "(Nはミリ秒)を使用できます。
mr.spuratic

使用usleep@Luisバスケスと@sebixの書き込みのように
Ilan.K

Apple MacOSにはBSDスリープがあり、これは小数秒もサポートします
roblogic

125

coreutilssleepコマンドのドキュメントには次のように記載されています。

スリープの歴史的な実装では、数値が整数であることが必要であり、接尾辞のない単一の引数のみを受け入れました。ただし、GNUスリープは任意の浮動小数点数を受け入れます。浮動小数点を参照してください 。

したがって、あなたは使用することができsleep 0.1sleep 1.0e-1および同様の議論。


1

あなたがミックスしましたあるされていませんか
scai

私のセクションで私の更新を参照してください
-yael

1
ヤエル、あなたの質問にはまだ否定的なものが多すぎると思う。「不正な構文ではない」という意味ですか?
MadHatter

引数に不正な文字、Linuxの睡眠は約0.1作品罰金:#睡眠0.1スリープ: -たとえば私は、Solaris 10、この上で実行
ヤエル

58

スリープは10進数を受け入れるため、次のように分類できます。

1/2秒

 sleep 0.5

1/100秒

sleep 0.01

ミリ秒の間、あなたは望むでしょう

sleep 0.001

4
小数点の前に先行ゼロをドロップすることもできます。例えば。sleep .5
マイクコーザー14年


それを過度に複雑にしているすべての人について話してください
マーティン

1
@MikeCauserの先頭のゼロは、コードを読みやすくするために、後で読みやすくします。また、実際に数学を行うときにも優れています。
アレクサンダーミルズ

11

これを試して精度を確認してください。

    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の解組み合わせ。


8

単に使用できますusleep。パラメーターとしてマイクロ秒(= 1e-6秒)を要するため、1ミリ秒スリープするには次のように入力します。

usleep 1000

1
$ usleep No command 'usleep' found, did you mean: Command 'sleep' from package 'coreutils' (main) usleep: command not found
Bulletmagnet

いいえ、少なくともすべてのRed Hat派生ディストリビューションで標準でusleepあるinitscriptsパッケージの一部を意味します。少なくともRHEL、CentOS、Fedora、Mageia / Mandriva、SuSEを含む。ここに例: `` ``
ルイス

1
CentOS 7で実行されているサンプルのイラストを示します。 `` `$ which usleep / usr / bin / usleep $ rpm -qf / usr / bin / usleep initscripts-9.49.37-1.el7_3.1.x86_64` ``要約するには: - sleep(からのcoreutils - )秒で動作しますusleep(からinitscriptsの)マイクロ秒で動作します
ルイス・バスケス

4

私は同じ問題を抱えていました(Solarisではシェルがスリープしていません)。

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

引数をチェックしません-あなたがそれを保持したい場合、適切に書かれたものをお勧めしますが、それ(gcc usleep.c -o usleep)はあなたを穴から追い出します。


1
あなたは可能性があり、少なくとも変更裸というusleep()コールには、if(argc == 1) { usleep(atoi(argv[1])); }予期しない動作の任意の数につながる可能配列の境界の外のインデックスを避けるために。
CVn

これは、実際のです@aCVn if (argc == 2) { usleep(atoi(argv[1])); }...
リングØ

また、usleep単位はμsであるため、1秒待機するには1000000引数を指定する必要があります。
リングØ

@RingØそう。愚かな間違い、良いキャッチ。
CVn

atoi()文字列をに変換するという恐ろしい選択intです。何がatoi( "STRING" )戻りますか?atoi()エラーを返す方法はありません。
アンドリューヘンレ

0

私はusleepのアイデアが好きですが、その下でコメントすることはできません。これが私を助けてくれたので、私の提案がusleepのアイデアを改善できることを願っています。

https://github.com/fedora-sysv/initscripts/blob/3c3fe4a4d1b2a1113ed302df3ac9866ded51b01b/src/usleep.cは、redhatエコシステム上のusleep.cの実際のソースコードです。

Solarisでコンパイルしてみてください。おそらくhttps://www.opencsw.org/packages/libpopt0/が必要でしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.