ただし、これは RedHat 系固有のコマンドなので、Ubuntu (や Debian)でも使いたいと思って調べて初めて知ったことがあったのでメモ。
話は簡単で、sleepenh コマンドを使う。
私はこの記事で見つけた。
現行の 12.10 (Quantal) に対応するパッケージはこれ
で、man page はこんな感じ。
文字通り拡張版sleepということのようだが、コマンド名を変えているだけあって仕様に違いがある。
SLEEPENH(1) SLEEPENH(1)
NAME
sleepenh - an enhanced sleep program.
SYNOPSIS
sleepenh [initial-time] sleep-time
DESCRIPTION
sleepenh is a program that can be used when there is a need to execute
some functions periodically in a shell script. It was not designed to
be accurate for a single sleep, but to be accurate in a sequence of
consecutive sleeps.
After a successful execution, it returns to stdout the timestamp it
finished running, that can be used as initial-time to a successive exe-
cution of sleepenh.
OPTIONS
There are no command line options. Run it without any option to get a
brief help and version.
ARGUMENTS
sleep-time is a real number in seconds, with microseconds resolution (1
minute, 20 seconds and 123456 microseconds would be 80.123456).
initial-time is a real number in seconds, with microseconds resolution.
This number is system dependent. In GNU/Linux systems, it is the number
of seconds since midnight 1970-01-01 GMT. Do not try to get a good
value of initial-time. Use the value supplied by a previous execution
of sleepenh.
If you don't specify initial-time, it is assumed the current-time.
usleep の場合は単純にマイクロ秒単位の整数値で指定できる版のsleepなのだが、sleepenh の場合は、引数(上記の 'sleep-time' )に秒単位で指定する。じゃあ、500ms sleep したい場合はどうするか?と言えば、赤太字で強調したように、引数は整数ではなく「実数」ということになっているので、0.5 と指定すればよい。精度は、仕様上はマイクロ秒まで。
なお、精度が「仕様上」マイクロ秒まで…と書いたのには理由があって、ライブラリ/kernelの内部的な処理には適当な丸めが入るので、マイクロ秒単位の精度で指定したからといってもかならずしもそうなるわけではない。このあたり、書きはじめるとけっこうな量になるので、さてやりますか…と、思ってまずは関連文献の調査ということで、ぐぐったら、id:naoya さんのすばらしい記事が出てきた... :o
「Linux のスリープ処理、タイマ処理の詳細を見る」
http://d.hatena.ne.jp/naoya/20080122/1200960926
さすが…
なお、精度が「仕様上」マイクロ秒まで…と書いたのには理由があって、ライブラリ/kernelの内部的な処理には適当な丸めが入るので、マイクロ秒単位の精度で指定したからといってもかならずしもそうなるわけではない。このあたり、書きはじめるとけっこうな量になるので、さてやりますか…と、思ってまずは関連文献の調査ということで、ぐぐったら、id:naoya さんのすばらしい記事が出てきた... :o
「Linux のスリープ処理、タイマ処理の詳細を見る」
http://d.hatena.ne.jp/naoya/20080122/1200960926
さすが…
(この精度のくだりのあたり、@_hito_ さんからご指摘をいただいて追記しました。@_hito_ さん、どうもありがとうございます!)
なお、man page を長々と引用したのにも理由があって、実数を2つ指定していろいろ凝ったことができる...、特に途中で(可変時間の)処理をはさみながらも、決まった間隔でループをまわしたい場合等に便利な仕様になっているので、良く読んで使うべしということで。(指定する時間の単位の違いより、実はこっちのほうが重要な気がする....)
No comments:
Post a Comment