Linux

Shell:是否可以在不使用sleep的情況下延遲命令?

  • November 21, 2018

是否有任何替代品、替代品或 bash 技巧可以在不使用的情況下延遲命令sleep?例如,在不實際使用 sleep 的情況下執行以下命令:

$ sleep 10 && echo "This is a test"

您有替代方案sleep: 它們是atcron。與sleep這些相反,您需要提供您需要它們執行的時間。

  • 通過執行確保atd服務正在執行service atd status

現在假設日期是世界標準時間上午 11:17;如果您需要在 11:25 UTC 執行命令,則語法為:echo "This is a test" | at 11:25.

現在請記住,atd預設情況下不會記錄作業的完成情況。有關更多資訊,請參閱此連結。您的應用程序最好有自己的日誌記錄。

  • 您可以在 中安排作業cron,更多參考:man cron查看其選項或crontab -e添加新作業。/var/log/cron可以檢查有關作業執行的資訊。

僅供參考sleep system call ,暫停目前執行並根據傳遞給它的參數安排它。

編輯:

正如@Gaius 提到的,您還可以在at命令中添加分鐘時間。但是可以說時間是12:30:30,現在您使用now +1 minutes. 即使指定了 1 分鐘(轉換為 60 秒),at也不會真正等到12:31:30執行作業,而是在12:31:00. 時間單位可以是minutes, hours, days, or weeks。更多參考man at

例如:echo "ls" | at now +1 minutes

使用bash內置函式,您可以執行以下操作:

coproc read -t 10 && wait "$!" || true

休眠 10 秒而不使用sleep. 這樣做的coproc目的是使read’s stdin 是一個不會有任何東西出來的管道。|| true是因為的退出狀態將反映 SIGALRM 傳遞,如果設置了該選項wait,這將導致 shell 退出。errexit

在其他外殼中:

mksh並且ksh93sleep內置的,在那裡使用其他任何東西沒有意義(儘管它們都支持read -t)。

zsh也支持read -t,但也有一個內置的包裝器select(),所以你也可以使用:

zmodload zsh/zselect
zselect -t 1000 # centiseconds

如果您想要安排從互動式 shell 會話執行的東西,另請zsh/sched參閱zsh.

引用自:https://unix.stackexchange.com/questions/482725