LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルのsleepコマンドは、指定した時間だけ処理を一時停止(待機)させるコマンドです。
シェルスクリプトで処理の間隔を空けたい場合や、一定時間後にコマンドを実行したい場合に使用します。
本記事ではsleepコマンドの基本的な使い方から、シェルスクリプトでの実践的な活用例まで解説します。
sleepコマンドの基本構文と時間単位
構文は以下の通りです。
sleep 数値[単位]数値に待機したい時間を指定します。単位を省略した場合は「秒」として扱われます。
sleepで使える時間単位(秒・分・時間・日)
数値の後に以下の単位を付けることで、秒以外の時間を指定できます。
| 単位 | 意味 | 例 |
|---|---|---|
s | 秒(seconds) | sleep 5s(5秒待機) |
m | 分(minutes) | sleep 2m(2分待機) |
h | 時間(hours) | sleep 1h(1時間待機) |
d | 日(days) | sleep 1d(1日待機) |
※単位の指定はGNU coreutilsのsleepコマンドで利用できます。一般的なLinuxディストリビューション(UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション、CentOSCentOS [セントオーエス]Red Hat Enterprise Linux互換の安定したLinuxディストリビューション、DebianDebian [デビアン]コミュニティ主導で開発される安定性の高いLinuxディストリビューションなど)ではデフォルトで使用可能です。
ただし、macOSmacOS [マックオーエス]Appleが開発するMac用のオペレーティングシステムに標準搭載されているBSD版のsleepでは、GNU版のようなm、h、dなどの時間単位や小数による指定には対応していません(整数秒のみ)。macOSで分・時間単位や小数秒の指定を使いたい場合は、brew install coreutilsでGNU版をインストールし、gsleepコマンドを利用してください。
sleepコマンドの使い方【単位別】
sleepで秒単位の待機をする
最もよく使う基本的な使い方です。以下は5秒間待機する例です。
sleep 5単位sを明示しても同じ意味になります。
sleep 5ssleepで分単位の待機をする
2分間待機する場合は以下のように指定します。
sleep 2msleepで時間(hours)単位の待機をする
1時間待機する場合は以下のように指定します。
sleep 1hsleepで日(days)単位の待機をする
1日待機する場合は以下のように指定します。
sleep 1dsleepで小数秒の待機をする
GNU coreutilsのsleepコマンドでは小数を指定することで、1秒未満の待機も可能です。
sleep 0.5上記は0.5秒(500ミリ秒)待機します。
sleep 1.5上記は1.5秒待機します。
※sleepコマンドにはms(ミリ秒)のサフィックスは存在しません。ミリ秒単位の待機を行いたい場合は、sleep 0.5やsleep 0.001のように小数で秒数を指定してください。
また、前述のとおりmacOSのBSD版sleepでは小数の指定にも対応していないため、注意が必要です。
sleepで複数の時間を組み合わせて指定する
GNU coreutilsのsleepでは、複数の引数を指定すると合計の時間だけ待機します。
sleep 1m 30s上記は1分30秒(合計90秒)待機します。
シェルスクリプトでのsleepの活用例
sleepコマンドはシェルスクリプト内で処理を制御する際に活用されます。
ここでは実務でよく使われるパターンを紹介します。
sleepで処理の間隔を空ける
処理と処理の間に一時停止を入れたい場合に使用します。
#!/bin/bashecho "処理1を実行します..."# 処理1sleep 3echo "3秒後に処理2を実行します..."# 処理2実行結果
$ bash interval.sh処理1を実行します...(3秒待機)3秒後に処理2を実行します...sleepとwhileループで一定間隔の繰り返し実行をする
whileループと組み合わせることで、一定間隔でコマンドを繰り返し実行できます。
#!/bin/bashwhile true; do echo "$(date '+%Y-%m-%d %H:%M:%S') - 監視中..." sleep 60done上記のスクリプトは、前回の処理が終わった後に60秒待機し、再び処理を実行します。
サーバーの死活監視やログ監視などで活用できます。
停止するにはCtrl + Cを押します。
sleepでリトライ処理を実装する
外部APIAPI [エーピーアイ]Application Programming Interface。異なるソフトウェア間の接続口やサービスへの接続が失敗した場合に、一定間隔でリトライする処理を実装できます。
#!/bin/bashMAX_RETRY=5RETRY_INTERVAL=10count=0
while [ $count -lt $MAX_RETRY ]; do echo "接続を試みます...(${count}回目)"
# 接続処理(例:curlでヘルスチェック) # -f オプション:HTTPエラー時にcurl自体が失敗(終了コード非0)を返す # -s オプション:進捗表示を非表示にする # -o /dev/null:レスポンス本文を破棄する if curl -f -s -o /dev/null http://example.com; then echo "HTTPリクエストに成功しました。" exit 0 fi
count=$((count + 1)) echo "接続に失敗しました。${RETRY_INTERVAL}秒後にリトライします..." sleep $RETRY_INTERVALdone
echo "最大リトライ回数(${MAX_RETRY}回)に達しました。"exit 1上記のスクリプトは、最大5回まで10秒間隔でリトライを行います。
curlの-fオプションを使うことで、HTTPHTTP [エイチティーティーピー]HyperText Transfer Protocol。Webでのデータ転送プロトコルステータスが400以上の場合にcurlコマンド自体が失敗を返すため、if文で直接成功・失敗を判定できます。
sleepでカウントダウンタイマーを作る
sleepを利用したカウントダウンタイマーも作成できます。
#!/bin/bashecho "10秒後に処理を開始します..."for i in $(seq 10 -1 1); do echo "${i}..." sleep 1doneecho "処理を開始します!"実行結果
$ bash countdown.sh10秒後に処理を開始します...10...9...8...(省略)1...処理を開始します!sleepをバックグラウンドで実行する方法
コマンドの末尾に&を付けると、sleepをバックグラウンドで実行できます。
待機中に別の作業を行いたい場合に便利です。
sleep 30 &echo "sleepをバックグラウンドで実行中..."バックグラウンドで実行したプロセスを確認するにはjobsコマンドを使用します。
jobs[1]+ Running sleep 30 &sleepコマンドを途中で中断・キャンセルする方法
フォアグラウンドのsleepを中断する
フォアグラウンドで実行中のsleepを中断するには、Ctrl + Cを押します。
バックグラウンドのsleepを中断する
バックグラウンドで実行中のsleepを中断するには、killコマンドを使用します。
sleep 300 &kill %1%1はジョブ番号です。jobsコマンドで確認できます。
sleepコマンドを使う際の注意点
sleepの過度な使用を避ける
自動化スクリプトで理由なく長いsleepを入れると、処理効率が低下します。
ファイルの変更を監視したい場合はinotifywaitコマンドなど、目的に適した専用ツールの利用を検討しましょう。
sleepの待機時間の精度について
sleepでは小数秒を指定できますが、指定した時間ぴったりに処理が再開されることが保証されるわけではありません。
待機時間がずれる主な原因は以下の2つです。
- OSOS [オーエス]Operating System。基本ソフトウェアのタイマー周期(tick)による丸め:Linuxカーネルは周期的なタイマー割り込み(一般に数ms単位)でスレッドを起床させるため、それ以下の微小な時間を指定しても実際の起床タイミングは丸められます
- 外部コマンド起動のオーバーヘッド:シェルスクリプトから
sleepを呼び出す際、新しいプロセスを生成(fork)するまでに数ms〜数十msの時間がかかります。実際の停止時間は「プロセスの起動時間+指定した時間」となるため、ミリ秒単位の短い制御ではこのオーバーヘッド自体が無視できない遅延になります
厳密なタイミング制御が必要な場合は、用途に応じてプログラミング言語のタイマー機能や、シェルの組み込みコマンドであるread -tのタイムアウト機能などの利用を検討してください。
sleepはシグナルによって中断されることがある
sleepコマンドはSIGTERMやSIGINTなどのシグナルによって待機を中断されることがあります。
たとえば、Ctrl + Cを押すとSIGINTが送信され、sleepの待機が中断されます。
スクリプト内でtrapを使うことで、シグナル受信時の動作をカスタマイズできます。
#!/bin/bashtrap "echo '中断されました'; exit 1" SIGINT SIGTERM
echo "60秒間待機します(Ctrl+Cで中断可能)"sleep 60echo "待機完了"まとめ
sleepコマンドはLinuxで処理を一時停止させるためのシンプルなコマンドです。
基本的な使い方をまとめると以下の通りです。
| 用途 | コマンド例 |
|---|---|
| 5秒待機 | sleep 5 |
| 2分待機 | sleep 2m |
| 1時間待機 | sleep 1h |
| 0.5秒待機 | sleep 0.5 |
| 1分30秒待機 | sleep 1m 30s |
シェルスクリプトでの処理間隔の調整やリトライ処理、定期的な監視処理など、実務で幅広く活用できます。
用途に合わせてsleepコマンドを使いこなしましょう。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。