睡眠直到下次出現特定時間

睡眠直到下次出現特定時間

我需要一系列命令或單一命令,該命令會休眠直到下一次出現“4:00”等特定時間。

我該怎麼做呢?

命令at或 cronjob 不是一個選項,因為我不能離開目前所在的腳本。

我所說的具體情況是在螢幕上運行的腳本。非常重要的是,我不要透過腳本本身來停止腳本的執行,因為腳本中的某個點需要儲存許多重要的變數。該腳本並不總是應該定期執行。它只需要在特定時間執行。

如果腳本必須建立任何檔案或任何其他任務(例如 cronjobs 或其他螢幕),那將非常有益。這只是一個設計問題。

我只是有一個很棒的想法:

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

您有更好的想法嗎?

如果需要,將添加更多資訊!

答案1

特登的建議可行,但我想我的建議更有效。

difference=$(($(date -d "4:00" +%s) - $(date +%s)))

if [ $difference -lt 0 ]
then
    sleep $((86400 + difference))
else
    sleep $difference
fi

這是計算給定時間和當前時間之間的差異(以秒為單位)。如果數字是負數,我們必須添加一整天的秒數(準確地說是 86400)才能得到我們必須睡覺的秒數,如果數字是正數,我們就可以使用它。

答案2

假設它是一個 shell 腳本,這應該可以工作:

while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done

那是24小時的時間。如果您希望此操作在凌晨 4:00 和下午 4:00 繼續,請改用以下命令:

while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done

答案3

開放BSD,以下內容可用於壓縮*/55 分鐘的內容crontab(5)將工作改為00每小時一次(以確保產生較少的電子郵件,同時以精確的時間間隔執行相同的任務):

#!/bin/sh -x
for k in $(jot 12 00 55)
  do
  echo $(date) doing stuff
  sleep $(expr $(date -j +%s $(printf %02d $(expr $k + 5))) - $(date -j +%s))
done

請注意,date(1)也會打破sleep(1)根據最終迭代的設計,60分鐘不是有效時間(除非是有效時間!),因此我們無需在獲取電子郵件報告之前等待任何額外時間。

另請注意,如果其中一次迭代花費的時間超過分配給它的 5 分鐘,sleep同樣會因設計而慷慨地失敗,根本不休眠(因為負數被解釋為命令列選項,而不是環繞到下一個小時甚至永遠),從而確保您的工作仍然可以在分配的小時內完成(例如,如果只有一個迭代需要5 分鐘多一點,那麼我們仍然有時間趕上,而無需任何事情都會持續到下一個小時)。

printf(1)是必需的,因為date分鐘規格預計精確為兩位數。

相關內容