sleepコマンドなしでbashを眠らせる

Thu Jan 8 08:42:05 JST 2026 (modified: Thu Jan 8 08:49:22 JST 2026)
views: 586, keywords:Linux, SCHED_DEADLINE

 前回の記事で 「SCHED_DEADLINEをシェルスクリプトで試すにはフォークしたらアカン」 ということを書きました。 なので、3秒ごとに1ミリ秒間リアルタイムで動かすシェルスクリプトではsleepコマンドを使わず、CPUを100%使わせてました。

 ただ、sleepなしでもBashを眠らせられないかと疑問に思ったので調べたところ、stack overflowに、readにタイムアウトを設定するとできると書いてありました。 ということでやってみました。readはビルトインコマンドなので、フォークしません。

実験

 前回のシェルスクリプトに、1行readの行を加えました。これで、「SECONDSの値が変わってechoしたら次のループに行くまで1秒待つ」というコードになります。

ueda@raspi5:~$ cat some_task_read.bash
   #!/bin/bash
   
   n=1
   while true ; do
       if [[ "$SECONDS" != "$PREV" ]] ; then
           echo $SECONDS $n  #これが仕事
           PREV=$SECONDS
           read -t 1 _hoge   #加筆: 入力を1秒待ってタイムアウト
       fi
   
       ((n++))
   done

 これを前回のリアルタイム処理と組み合わせると、

  1. 前回から3秒後、SECONDSの値が変わっているのでechoが実行される
  2. echoのあとすぐにreadが実行され、システムコールが発行されてカーネルがシェルスクリプトをランキューから外す
  3. 1秒ではなく次の周期までシェルスクリプトが寝たままになり、3秒後に1に移行

という挙動になると思われます。

動かしてみる

 とりあえず単体で動かしてみます。

ueda@raspi5:~$ ./some_task_read.bash
   0 1
   1 2
   2 3
   3 4
   4 5
   ・・・

 他の端末で見たところ、CPUはほとんど使ってませんでした。STATS+になってるので、寝たまま端末をガメているという状態になっています。

ueda@raspi5:~$ ps u -C some_task_read.bash
   USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
   ueda        9431  0.0  0.0   5216  3200 pts/0    S+   18:51   0:00 /bin/bash ./some_task_read.bash

 ちなみにreadの行がないと、CPUの使用率は100%になります。

SCHED_DEADLINEと組み合わせる

 前回と同じ挙動になりました(端末の様子は割愛)。CPUはより使わないようになり、おそらく他のプロセスに迷惑をかける度合いは大幅に減少しているはずです。

 なるほど。

ノート   このエントリーをはてなブックマークに追加 
 

prev:LinuxのSCHED_DEADLINEの動作確認 next:sleepコマンドなしでbashを眠らせる

やり散らかし一覧

記事いろいろ