次に特定の時間になるまで眠る


11

「4:00」のような特定の時間が次に発生するまでスリープする一連のコマンドまたは単一のコマンドが必要です。

どうすればいいですか?

at私は現在てるスクリプトを残してはいけないため、コマンドまたはcronジョブはオプションではありません。

私が話している特定のケースは、画面で実行されているスクリプトです。スクリプトのある時点で必要な多くの重要な変数が格納されているため、スクリプト自体によるスクリプトの実行を停止しないことが非常に重要です。スクリプトは、常に通常の方法で実行されるとは限りません。特定の時間に実行する必要があるだけです。

スクリプトがファイルや、cronjobsやその他の画面などのその他のタスクを作成する必要がある場合、それは非常に有益です。これは単にデザインの問題です。

私はちょうどいい考えを持っていました:

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

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

もっと良いアイデアはありますか?

必要に応じて、さらに情報が追加されます!


あなたの質問を少し明確にしていただけませんか?あなたが言うとき、あなたは何を意味するのか:「私は私が現在てるスクリプト残してはいけない」
sebelk

「ウェイクアップ」ファイルの存在をスクリプトでチェックし、しばらくチェックしてから再度チェックしますか?次に、cronを使用してファイルを作成し、cronの信頼性を利用できますが、長寿命のスクリプトも使用できます。スクリプトがスリープを停止したときに「ウェイクアップ」ファイルを削除するだけです。
kurtm 2013年

Macでは、に置き換えdate -ddate -j、に置き換え4:00てください0400
pjvandehaar

回答:


17

terdonの提案は機能しますが、私のほうが効率的です。

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

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

これは、指定された時間と現在の時間の差を秒単位で計算しています。数値が負の場合、1日の秒数(正確には86400)を追加して、スリープする必要がある秒数を取得する必要があります。また、数値が正数の場合は、そのまま使用できます。


システムクロックが前後に動くとどうなるか(例:ntp)。
WhyNotHugo 2017

10

それがシェルスクリプトであると仮定すると、これはうまくいくはずです:

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

これは24時間です。これを4:00 AMと4:00 PMの両方で続行する場合は、代わりにこれを使用します。

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

これはオプションかもしれません。私はちょうど考えを持ちました。数分後に戻ります。
BrainStone 2013年

0

のOpenBSD、次のようにコンパクトに使用できる*/55分crontab(5)に仕事00(正確な間隔で同じタスクを実行しながら、必ず少数の電子メールが生成されたすべてを作るために)時間ごとの1を:

#!/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分は有効な時間ではないので(そうでない場合は!)、最後の反復で意図的にを壊すことに注意してください。したがって、電子メールレポートを取得する前に余分な時間を待つ必要はありません。

また、反復の1つに割り当てられた時間が5分を超える場合sleepは、同様に設計上、まったくスリープしないことにより、優雅に失敗します(負の数は、コマンドラインオプションとして解釈される代わりに、次の1時間または永遠に)、したがって、割り当てられた1時間以内にジョブがまだ完了できることを確認します(たとえば、反復の1つだけが5分以上かかる場合でも、遅れることなく、追いつく時間があります。次の1時間に回り込むもの)。

分の指定には正確に2桁printf(1)が必要なので、が必要ですdate

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.