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これを前回のリアルタイム処理と組み合わせると、
- 前回から3秒後、
SECONDSの値が変わっているのでechoが実行される echoのあとすぐにreadが実行され、システムコールが発行されてカーネルがシェルスクリプトをランキューから外す- 1秒ではなく次の周期までシェルスクリプトが寝たままになり、3秒後に1に移行
という挙動になると思われます。
動かしてみる
とりあえず単体で動かしてみます。
ueda@raspi5:~$ ./some_task_read.bash
0 1
1 2
2 3
3 4
4 5
・・・ 他の端末で見たところ、CPUはほとんど使ってませんでした。STATがS+になってるので、寝たまま端末をガメているという状態になっています。
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はより使わないようになり、おそらく他のプロセスに迷惑をかける度合いは大幅に減少しているはずです。
なるほど。
ノート
Tweet