Tuesday, February 12, 2013

UbuntuのsleepenhとRedHatのusleepの違い

いろいろ検証っぽいことをしていると、1秒単位でしか指定できない sleep コマンドでは足りなくて、usleep を使うことがよくある。

ただし、これは 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

さすが…

(この精度のくだりのあたり、@_hito_ さんからご指摘をいただいて追記しました。@_hito_ さん、どうもありがとうございます!)

なお、man page を長々と引用したのにも理由があって、実数を2つ指定していろいろ凝ったことができる...、特に途中で(可変時間の)処理をはさみながらも、決まった間隔でループをまわしたい場合等に便利な仕様になっているので、良く読んで使うべしということで。(指定する時間の単位の違いより、実はこっちのほうが重要な気がする....)

No comments:

Post a Comment