在 Linux 系統管理與 Shell 腳本撰寫中,sleep 命令是控制執行節奏的關鍵工具。它能讓腳本暫停指定時間,適用於輪詢檢查、延遲重試、定時任務協調等場景。本文將詳細解析 sleep 的語法、時間單位、進階用法,並釐清 Linux 與 Windows 版本的差異,助你精準掌握腳本流程控制。
sleep 的核心語法極為簡潔:
sleep NUMBER[SUFFIX]...
若省略後綴,預設單位為秒(s)。支援的時間後綴包括:
s - 秒(預設)m - 分鐘h - 小時d - 天多個時間值可組合使用,例如 sleep 1m 30s 等同於暫停 90 秒。小數數值同樣有效,sleep 0.5 即暫停半秒。
# 暫停 1 秒
sleep 1
sleep 1s
# 暫停 2 分鐘
sleep 2m
# 組合時間:1 分 30 秒
sleep 1m 30s
#!/bin/bash
# 等待服務啟動,每 5 秒檢查一次,最多嘗試 12 次(共 60 秒)
for i in {1..12}; do
if systemctl is-active --quiet nginx; then
echo "Nginx 已就緒"
break
fi
echo "等待 Nginx 啟動... ($i/12)"
sleep 5
done
# 每天凌晨 3 點執行備份,但隨機延遲 0-300 秒避免 I/O 擁塞
sleep $((RANDOM % 300))
/usr/local/bin/backup.sh
使用 sleep --version 可顯示版本、授權與作者資訊,確認是否為 GNU coreutils 版本:
| 平台 | 命令/函數 | 時間單位 | 範例:暫停 1 秒 |
|---|---|---|---|
| Linux | sleep 命令 | 秒(預設) | sleep 1 |
| Windows (CMD) | timeout 命令 | 秒 | timeout /t 1 |
| Windows (PowerShell) | Start-Sleep Cmdlet | 秒(預設)、毫秒 | Start-Sleep -Seconds 1Start-Sleep -Milliseconds 1000 |
| Windows API | Sleep() 函數 | 毫秒 | Sleep(1000) |
核心差異:Linux sleep 以秒為基礎單位,Windows API Sleep() 則以毫秒為單位。跨平台腳本移植時務必注意單位換算,避免延遲時間相差 1000 倍導致嚴重邏輯錯誤。
echo 5 | sleep 從管道讀取秒數。sleep 0.001(1 毫秒),實際精度受系統時鐘中斷頻率限制。trap 處理信號:在腳本中捕捉 SIGINT/SIGTERM 時,可中斷 sleep 並執行清理邏輯。inotifywait 監聽檔案系統事件。sleep 而非忙等待:while :; do :; done 會佔滿 CPU 核心,sleep 則釋放 CPU 給其他進程。掌握 sleep 的靈活運用,能讓你的 Shell 腳本更健壯、高效,並在跨平台環境中避免時間單位陷阱。