はじめに

こんにちは!今回はsleepコマンドについて解説します。

sleepは、指定した時間だけプログラムの実行を待機(スリープ)させるコマンドです。スクリプトで遅延処理が必要な時に活躍します。

シンプルですが、スクリプトを書くなら必須レベルで使いますよ。

sleepコマンドとは

sleepは、指定された時間の間プロセスを停止する外部コマンドです。

主な使い道:

  1. スクリプトの遅延処理 - 特定の時間待機
  2. リトライロジック - 失敗時に数秒待ってリトライ
  3. ポーリング処理 - 定期的に処理を繰り返す
  4. 処理の分散 - 複数プロセスの実行タイミングを制御
  5. タイムアウト組み合わせ - タイムアウト機能の実装

時間単位は秒(s)、分(m)、時間(h)、日(d)で指定可能です。

基本構文

1
sleep 時間[単位]

デフォルトは秒です。sleep 5なら5秒待機します。

主なオプション

単位 説明
(なし) sleep 5
s sleep 5s
m sleep 2m
h 時間 sleep 1h
d sleep 1d

複数単位の組み合わせも可能:sleep 1h30m

使用例

例1: 5秒待機

1
2
3
echo "処理開始"
sleep 5
echo "5秒経過しました"

実行結果:

1
2
3
処理開始
(5秒待機)
5秒経過しました

最もシンプルな使い方。

例2: 小数点での秒数指定

1
2
3
echo "0.5秒待機"
sleep 0.5
echo "完了"

実行結果:

1
2
3
0.5秒待機
(0.5秒待機)
完了

小数点で0.5秒単位での指定も可能。

例3: 分単位での指定

1
2
3
echo "2分待機します"
sleep 2m
echo "2分経過"

実行結果:

1
2
3
2分待機します
(2分待機)
2分経過

mで分を指定。

例4: リトライロジック

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash
max_retry=3
retry=0

while [ $retry -lt $max_retry ]; do
    if command; then
        echo "成功"
        exit 0
    fi
    retry=$((retry + 1))
    if [ $retry -lt $max_retry ]; then
        echo "リトライまで5秒待機..."
        sleep 5
    fi
done
echo "失敗"

実行結果:

1
2
3
(コマンド実行)
リトライまで5秒待機...
(5秒待機)

失敗時に待機してリトライ。

例5: ポーリング処理

1
2
3
4
5
6
#!/bin/bash
for i in {1..5}; do
    echo "チェック $i"
    sleep 2
done
echo "完了"

実行結果:

1
2
3
4
5
6
チェック 1
(2秒待機)
チェック 2
(2秒待機)
...
完了

定期的に処理を繰り返す。

例6: 複数単位の組み合わせ

1
2
3
echo "1時間30分待機"
sleep 1h30m
echo "経過"

実行結果:

1
2
3
1時間30分待機
(1時間30分待機)
経過

複数単位を組み合わせ。

例7: バックグラウンド処理

1
2
(sleep 10; echo "10秒後のメッセージ") &
echo "今すぐのメッセージ"

実行結果:

1
2
3
今すぐのメッセージ
(10秒待機)
10秒後のメッセージ

バックグラウンドで遅延メッセージ。

例8: タイムアウト実装

1
2
3
4
5
#!/bin/bash
timeout 5 long_running_command
if [ $? -eq 124 ]; then
    echo "タイムアウト"
fi

実行結果:

1
2
(5秒後にタイムアウト)
タイムアウト

timeoutコマンドと組み合わせ。

例9: ステップバイステップの処理

1
2
3
4
5
6
#!/bin/bash
echo "ステップ1"
sleep 2
echo "ステップ2"
sleep 2
echo "ステップ3"

実行結果:

1
2
3
4
5
ステップ1
(2秒待機)
ステップ2
(2秒待機)
ステップ3

複数ステップの処理間に待機。

例10: ループで段階的な待機

1
2
3
4
5
6
#!/bin/bash
for wait_time in 1 2 3; do
    echo "あと${wait_time}秒"
    sleep $wait_time
done
echo "開始!"

実行結果:

1
2
3
4
5
6
7
あと1秒
(1秒待機)
あと2秒
(2秒待機)
あと3秒
(3秒待機)
開始!

変数で待機時間を制御。

Tips・注意点

sleepはシグナル受信で中断可能

1
2
# ターミナルで Ctrl+C を押すと中断
sleep 60

sleep実行中にCtrl+Cで中断できます。

小数点での精度

1
sleep 0.001  # 1ミリ秒(環境依存)

小数点での精度は環境依存。通常は0.1秒単位が目安。

sleepの単位省略時の動作

1
2
sleep 10    # 10秒
sleep 10s   # 10秒(明示的)

単位を省略すると秒として扱われます。

実践的な使い方

APIリクエストのレート制限

1
2
3
4
5
6
7
#!/bin/bash
urls=("url1" "url2" "url3")

for url in "${urls[@]}"; do
    curl "$url"
    sleep 1  # 1秒待機してレート制限を回避
done

APIアクセスのレート制限対策。

ファイル作成の監視

1
2
3
4
5
6
#!/bin/bash
while [ ! -f "/tmp/ready" ]; do
    echo "ファイル待機中..."
    sleep 5
done
echo "ファイルを検出"

ファイルの作成を監視して待機。

デーモンプロセス

1
2
3
4
5
#!/bin/bash
while true; do
    echo "$(date): 定期処理実行"
    sleep 60  # 1分ごとに実行
done

1分ごとに定期処理を実行。

ログローテーション時の遅延処理

1
2
3
4
#!/bin/bash
mv logfile logfile.old
sleep 1
gzip logfile.old

ファイル操作の間に待機。

まとめ

sleepコマンドのポイント:

  • 指定時間だけプロセスを停止するコマンド
  • デフォルト: 秒単位(例:sleep 5
  • 単位指定: s(秒)、m(分)、h(時間)、d(日)
  • 小数点対応: sleep 0.5(0.5秒)
  • 複合単位: sleep 1h30m(1時間30分)
  • よく使う組み合わせ: sleep 5 && command, sleep 0.1

シェルスクリプトで遅延処理が必要な時には、ほぼ必ず出てくるコマンドですよ!