Bashスクリプトは、LinuxやUnixシステム上でタスクを自動化するための強力なツールです。その中でしばしば使われるのがsleepコマンド。このコマンドを使うことで、スクリプトの実行を一時停止させ、効率的な時間管理やシステム負荷の調整が可能になります。この記事では、Bashスクリプト初心者向けにsleepコマンドの基本的な使い方と、実際の活用例を紹介します。sleepコマンド自体のオプションや単位の一覧はsleepコマンドの使い方まとめでも詳しく解説しています。
まず最もシンプルな例がこちらです。たった1行で5秒間の待機ができます。
sleep 5
sleepコマンドとは?
sleepコマンドは、指定した時間だけプログラムの実行を停止するために使用されます。時間は秒(s)、分(m)、時間(h)、日(d)で指定できます。この機能は、タスク間に意図的な遅延を入れたい場合に便利です。基本的な使い方は次のようになります。
sleep NUMBER[SUFFIX]
-
NUMBER: 遅延時間を指定するための数値 -
SUFFIX: 遅延時間の単位(省略時は秒)
単位別の指定例
指定できる単位は4種類あります。それぞれの書き方をまとめました。
| コマンド例 | 単位 | 待機時間 |
|---|---|---|
sleep 5 |
秒(デフォルト) | 5秒 |
sleep 1m |
分(m) | 1分(60秒) |
sleep 1h |
時間(h) | 1時間 |
sleep 1d |
日(d) | 1日(24時間) |
例:
sleep 5 # 5秒間停止
sleep 30m # 30分間停止
sleep 1h # 1時間停止
sleep 1d # 1日間停止
sleepコマンドの基本的な使い方
単純な遅延を作成する
sleepコマンドの最も基本的な利用法は、単純にプロセスの間に遅延を挟むことです。たとえば、一連の操作を毎秒実行するスクリプトがあるとしますが、実行間に少し間隔を持たせたい場合、以下のようにします。
#!/bin/bash
echo "開始"
sleep 2
echo "2秒後に実行"
sleepを使ってループ内で遅延する
ループ内で繰り返し処理を行う際に、各ループの間に一時停止を設けることでスクリプトのパフォーマンスを調整できます。以下は、毎秒カウントを増やして出力する簡単な例です。
#!/bin/bash
for i in {1..5}
do
echo "カウント: $i"
sleep 1 # 1秒待機
done
リトライ処理での活用
APIやサービスへの接続が失敗した場合、一定間隔でリトライする処理でも sleep が役立ちます。
#!/bin/bash
MAX_RETRY=5
RETRY_INTERVAL=10
for i in $(seq 1 $MAX_RETRY); do
echo "試行 $i / $MAX_RETRY"
curl -sf https://example.com/api && break
echo "失敗。${RETRY_INTERVAL}秒後にリトライします..."
sleep $RETRY_INTERVAL
done
複雑な例:Cronジョブのスリープタスク
sleepはcronジョブと組み合わせることで、特定時刻に処理を開始し、それから一定間隔でタスクを実行するように設定することもできます。以下にその一例を示します。例えば、夜間の負荷が低い時間帯に数分ごとにバックアップを取る設定です。
#!/bin/bash
# バックアップスクリプトの例
backup_function() {
echo "バックアップを実行中..."
# バックアップの処理
}
# 1時間ごとにバックアップを取る
for i in {1..6}
do
backup_function
sleep 10m # 10分待機
done
Cronでこのスクリプトを設定することで、毎晩2時に開始し所定の回数だけ実行し続けられます。
また、cron実行直後に少し待機してから処理を始めたい場合にも使えます。例えば、複数のcronジョブが同時起動して競合するのを避けるため、ランダムな秒数だけ待機させる手法があります。
#!/bin/bash
# cronから呼ばれた際、ランダムに0〜30秒待機してから実行
sleep $((RANDOM % 30))
echo "処理開始"
sleepによるスクリプトの柔軟性向上
様々な状況でsleepコマンドを効果的に利用することができます。以下はさらに具体的な活用例です。
インターバルテストの待機時間に使う
サーバーの監視テストを定期的に行う際、毎回のテスト間にsleepを挿入することでリソースの使用を調整できます。
#!/bin/bash
while true; do
echo "サーバーの状態をチェック中..."
# サーバーチェックの処理
sleep 15m
done
このようにすることで、15分ごとにサーバーのチェックを行い続けることができます。
APIリクエストの負荷制限
外部APIに多くのリクエストを送る際、相手サーバーに負荷をかけすぎないよう、リクエストとリクエストの間に待機時間を設けるのは実用的です。
#!/bin/bash
for i in {1..10}
do
echo "APIリクエスト送信: $i"
# APIリクエストの処理
sleep 5
done
これにより、リクエスト間が5秒の間隔で整然と行われ、API側への負荷を軽減できます。
sleepとwaitコマンドの違い
sleepと似たコマンドに wait があります。用途が異なるため、混同しないように注意してください。
| コマンド | 用途 | 主な使いどころ |
|---|---|---|
sleep N |
指定した時間だけ待機する | 一定時間の遅延を入れたいとき |
wait |
バックグラウンドプロセスの終了を待つ | 並列実行した子プロセスの完了を待つとき |
wait はバックグラウンドで実行したプロセス(& で起動したもの)が終了するまで待機します。時間ではなくプロセスの完了を待ちたい場合は wait を使います。
#!/bin/bash
# バックグラウンドで2つの処理を並列実行
process1 &
process2 &
# 両方の完了を待つ(sleep ではなく wait を使う)
wait
echo "すべての処理が完了しました"
環境差に関する注意点
sleepコマンドの挙動は、使用する環境(OSやシェル)によって一部異なります。
小数指定
GNU/Linux の sleep(GNU coreutils)では小数指定が使えます。macOS のデフォルト(BSD版)でも同様に使えます。
sleep 0.5 # 0.5秒(500ミリ秒)待機
sleep 1.5 # 1.5秒待機
複数引数の指定
GNU版の sleep では、複数の時間を引数として並べると合計時間だけ待機します。
sleep 1m 30s # 1分30秒待機(GNU環境のみ)
ただし、BusyBox環境(組み込みLinuxなど)や古いUNIXシステムでは、小数や複数引数がサポートされない場合があります。ポータブルなスクリプトを書く場合は整数秒のみを使うと安全です。
無期限に待機するsleep infinity
GNU coreutils版のsleepには、時間を指定せず無期限に待機し続けるinfinityという特殊な引数があります。Dockerコンテナをすぐに終了させず起動状態のまま維持したい場合などによく使われます。
sleep infinity # プロセスを終了させず待機し続ける
停止するには Ctrl+C でプロセスを中断するか、別のターミナルから kill コマンドでプロセスを終了させます。BusyBox環境ではinfinityがサポートされない場合があるため、コンテナのベースイメージによっては動作しない点に注意してください。
よくある質問(FAQ)
sleepコマンドの単位は?
デフォルトは秒(SUFFIX なし)です。mで分、hで時間、dで日を指定できます。例えば sleep 1m は1分間待機します。
sleep 60は何分?
sleep 60 はSUFFIXがないため秒単位で解釈され、60秒(1分)の待機になります。1分待機するには sleep 60 または sleep 1m のどちらでも同じです。
シェルスクリプトで待機するには?
秒数を指定して待機する場合は sleep を使います。バックグラウンドプロセスの終了を待つ場合は wait を使います。たとえばスクリプト中で「5秒後に次の処理を実行する」なら以下のように書きます。
echo "処理A"
sleep 5
echo "5秒後に処理B"
まとめ
sleepコマンドは、Bashスクリプト内でプロセスを一時停止するためのシンプルかつ効果的な方法です。時間間隔を調整し、タスク間の実行を制御することで、システムに過剰な負荷をかけず、スクリプトを適切に調整することが可能です。
- 単位なしは秒、
mで分、hで時間、dで日 - ループ・リトライ・cron組み合わせなど実用的な場面で活躍する
- バックグラウンドプロセスの完了待ちには
waitを使う - 小数や複数引数はGNU環境でのみ使える場合がある
このsleepの基本的な使い方をマスターすることで、スクリプトの柔軟性を飛躍的に高めることができます。スクリプトを運用する際には、状況に応じて適切な時間を設定し、システムやAPIの負荷を考慮しながら上手に活用してみてください。

コメント