しばらく寝るにはループが必要です。

しばらく寝るにはループが必要です。

マイコンピュータで1つの簡単なコマンドを繰り返すループを実行する必要があります。

私が必要だとしましょう:

  • この場合、次の簡単な方法で生成された列挙型(file-0、file-1、file-2、...)を増やしてファイルを保存します。time > file-$x
  • 私の時間を1秒の一部として表現したいので(たとえば)1/70秒ごとにこれを行う必要があります。

どうすればbashスクリプトですべてを正確に表現して表現できますか?

分数は不確実な数量を生成し、正確でなければならないため、小数点以下4〜5桁以上が必要です。

答え1

Bashで小数を小数に変換するには:

myvar=$(echo "scale=4; 5/10" | bc)

その後、値を繰り返すには

for i in $(seq 1 1000); do sleep $myvar; done

Debian(GNU)の睡眠実装は、10進数の睡眠値を受け入れるようです。

残念ながら..

この種の精度(小数点4〜5桁)を使用するには、Perlスクリプトやコンパイルされたプログラムなどが必要です。ループ内でプログラムを呼び出すことによるオーバーヘッドは、多くのジッタを追加します。スリープ呼び出し自体には数ミリ秒かかります。

1/10,000秒の睡眠を1000回行い、シナリオを考えてみましょう。

time for i in $(seq 1 1000); do sleep 0.0001; done

real    0m2.099s
user    0m3.080s
sys     0m1.464s

予想される結果は1/10秒です。睡眠はあなたが参照したいレベルに近いではありません。

https://stackoverflow.com/questions/896904/how-do-i-sleep-for-a-millisecond-in-perl

PerlのTime::HiRes、1000*1000マイクロ秒使用:

my $i=0;
for($i=0;$i<=1000;$i++) {
        usleep(1000);
}

real    0m1.133s
user    0m0.024s
sys     0m0.012s

しばらく近づいてみましょう。

答え2

たぶんあなたは単に実行することができます

sleep 0.7

man 1 sleep

私のarchlinuxディストリビューションから:

説明NUMBER秒間一時停止します。サフィックスは、秒(デフォルト)の場合は「s」、分の場合は「m」、時間の場合は「h」、日の場合は「d」です。 NUMBERが整数でなければならないほとんどの実装とは異なり、NUMBERは浮動小数点数にすることができます。複数の引数が与えられると、その値の合計で指定された時間だけ一時停止します。

答え3

プロセスを作成して新しい実行可能ファイルをロードするのに数ミリ秒かかることがあるため、この精度は実際には意味がありません。さらに、多くのシステムでは、CPU時間は最大10ミリ秒単位でプロセスに割り当てられます。

ただし、一部のsleep実装では分数秒が必要で、zshとksh93の両方が$SECONDS特殊変数を使用して分数秒にすることができますtypeset -F SECONDS

はい(zsh):

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((1./70)); date +%s.%N; done | { head -n3;echo ..;tail -n3; }; echo $SECONDS
1350076317.374870501
1350076317.391034397
1350076317.407278461
..
1350076318.464585550
1350076318.480887660
1350076318.497133050
1.1393780000

こんな、消えた。以下に基づいて睡眠時間を調整できます$SECONDS

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((i/70. - SECONDS)); date +%s.%N; done | { head -n3;echo ...;tail -n3; }; echo $SECONDS
1350076420.262775654
1350076420.277012997
1350076420.291302750
../..
1350076421.219682227
1350076421.234134663
1350076421.248255685
1.0020580000

sleep最後のANDコマンドを実行すると、追加の2ミリ秒がdate発生する可能性があります。

また、zshにはzselect100分の1秒で表示されるタイムアウト機能が組み込まれています。 ksh93にはsleep組み込み機能があり、浮動小数点を受け入れ、printf日付/時刻を印刷できます。

$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do ((i<4 || i>67)) && printf '%(%S.%N)T\n' now; sleep $((i/70.-SECONDS)); done; echo $SECONDS
20.823349000
20.837510000
20.851663000
21.780099000
21.794254000
21.808405000
0.9992358685

より正確なものが必要な場合は、リアルタイムOSまたはリアルタイム機能を備えたOSが必要な場合があります。そして確かにいいえシェルを使用してください。

答え4

下にアルパインLinux(Busybox)マイクロ秒(1秒usleep 10に相当)の間繰り返すことができます。0.00001

GNU sleep秒単位までサポートされます。sleep 0.00001

関連情報