Bash シェルスクリプトを X 秒間一時停止する

Niraj Menon 2023年1月30日
  1. Bash スクリプトを X 秒間一時停止する
  2. 可変時間の間 Bash スクリプトを一時停止する
  3. ユーザー入力が発生するまで Bash スクリプトを一時停止する
  4. 時間指定の一時停止とユーザー入力の一時停止を組み合わせる
Bash シェルスクリプトを X 秒間一時停止する

Bash スクリプトは、Bash コマンドシェルに 1 行ずつ入力する必要がない複数のコマンドを実行する場合に非常に便利です。シナリオによっては、スクリプトを一時停止して、ユーザーからの入力を受け入れるか、コマンドの結果が返されるまでスリープする必要がある場合があります。

このチュートリアルでは、Bash シェルスクリプトを一時停止するさまざまな方法について説明します。

Bash スクリプトを X 秒間一時停止する

スクリプトを最初から作成し、潜在的なユーザーにウェルカムメッセージを表示して、ユーザーがメッセージを読めるようにスクリプトの開始を遅らせる必要があると判断したとします。これにより、スクリプトが以前に何をするかが説明されます。さらに Bash コマンドの実行を開始します。Bash の sleep コマンドは、これを実現するのに役立ちます。詳細はこちらをご覧ください。その構文は次のとおりです。

sleep n

ここで、n は待機する秒数です。n は、数値を 10 進数として指定するだけで、ミリ秒などの小さな単位にすることもできます。したがって、30 ミリ秒の間一時停止したい場合は、sleep 0.030 でうまくいくはずです。

n は必須の引数であるため、sleep に実行する時間を指定しないと、うまくいきません。n の値なしで実行すると、次のエラーが発生します。

user@linux:~$ sleep
sleep: missing operand
Try 'sleep --help' for more information.

ほんの数秒よりもはるかに長く待機したい場合、sleep は時間の単位(つまり、分、時間、日)を指定する引数も受け入れるため、1 週間待機したい場合、sleep 7d はあなたの解決策!

sleep の使用例を次に示します。

# wait 500 milliseconds
sleep 0.5
# wait 1 second
sleep 1
# wait 20 seconds
sleep 20

メッセージを表示して 1 分待つには:

echo "Hello!  This script will run in exactly a minute!"
sleep 1m

スクリプトを再実行して、実行時間の長い Python プロセスを毎週強制終了します。

while true
do
    killall --older-than 7d python3
    sleep 7d
done

可変時間の間 Bash スクリプトを一時停止する

場合によっては、実行中のスクリプトの数に基づいてさまざまな遅延でスクリプトを実行したいために、さまざまな時間待機したいことがあります。良い例は、同じファイルを変更する必要がある可能性のある同じスクリプトを複数回実行している場合、2つの呼び出しが同時にファイルを変更しないように、スクリプトの呼び出しごとに異なる遅延が必要になることです。

その場合、n を実際の Bash スタイルの変数 n にして、スクリプトのある時点でその値を設定することができます。一例は次のとおりです。

N=5
sleep $N

これが配置されるスクリプトは、5 秒間スリープする必要があります。

$N の初期化を省略し、代わりにスクリプトを呼び出すときに値を指定する場合は、シェル環境で定義された N の値を使用して、スクリプトに sleep の時間帯を与えることができます。

user@linux:~$ cat test.sh
#! /bin/bash
sleep $N
user@linux:~$ export N=3
user@linux:~$ chmod +x test.sh
user@linux:~$ ./test.sh

その結果、スクリプトが 3 秒間実行されるのがわかります。N=2 ./test.sh を実行することで、環境値をオーバーライドして、スクリプト呼び出しで指定することもできます。

代わりに sleep の引数として $RANDOM を使用することで、遅延量をランダム化することを検討することもできます。したがって、sleep $RANDOM と言うことができます。

$RANDOM の値の範囲が大きすぎる場合は、オプションの付加値を使用してモジュラス演算を適用し、最小の遅延を確保して、数秒の範囲でスリープできるようにします。たとえば、10〜30 秒の間の特定の時間スリープするには、次のようにすることができます。

sleep $((10 + RANDOM % 21))

ユーザー入力が発生するまで Bash スクリプトを一時停止する

特定の時間待っても効果がない場合があります。ユーザーがウェルカムメッセージを読んだか、スクリプトの実行を開始する準備ができていることを確認することをお勧めします。その場合、開始する準備ができていることを示すために、何かを入力するのを待つ必要があります。

このために、ここで詳しく説明されている read コマンドを使用します。read は、標準入力(コマンドを入力するコマンドラインを標準入力と呼ぶことができます)にデータが入力されるのを待ち、最後の Enter キーストロークはデータが入力されたことをコマンドに通知します。次に、文字列を変数に配置するか、単に無視することができます。これは、ここで検討するユースケースです。

read の最も単純な呼び出しには引数は必要ありません。

read 

これにより、何かを入力する新しい行が出力されます。Enter キーを押すと、前に入力した内容に関係なく、Bash プロンプトに戻ります。

時間指定の一時停止とユーザー入力の一時停止を組み合わせる

時間指定の一時停止とユーザー入力の一時停止を組み合わせる必要がある優れたユースケースは、ユーザーが応答しない場合でもスクリプトを実行し続けることを保証することであり、そうすることは重要ではありません。read コマンドを使用すると、-t パラメーターを指定してこれを行うことができます。このパラメーターは、Enterキーが押されていない場合、コマンドがタイムアウトするまで数秒かかります。次のように使用されます。

read -t 5

その結果、Enter キーが押されたとき、または 5 秒が経過した場合のいずれか早い方で、読み取りが終了します。

別のユースケースは、ユーザー自身が指定した指定時間待機することです。その場合、次のように、ユーザーが整数値を入力するのを待ってから、それを引数として sleep に渡すことができます。

echo -n "Enter time to sleep: "
read $time
sleep $time

もちろん、これは、ユーザーが sleep の有効な引数を入力することを前提としています。

いくつかの例で要約しましょう!

  • sleep 3 は、スクリプトを正確に 3 秒間一時停止します。
  • sleep 3d は、スクリプトを正確に 3 日間一時停止します。
  • sleep $N は、$N として指定された秒数の間スクリプトを一時停止します。
  • sleep $((10 + RANDOM % 21)) は、10〜30 秒以内にランダムな時間スリープします。
  • read は、ユーザーが何かを入力するのを待ちます。
  • read -t 3 はユーザーが何かを入力するのを待ちますが、Enter キーが押されない場合は 3 秒でタイムアウトします。
  • read $time && sleep $time は、ユーザーから文字列引数を受け取り、それを sleep の引数として使用して、ユーザーがスリープする時間を指定できるようにします。