一連のコマンドや「4:00」などの特定の時間が表示されるまで、スリープ状態の単一のコマンドが必要です。
どうすればいいですか?
現在使用中のスクリプトを終了できないため、commandat
またはcronjobはオプションではありません。
私が言う具体的なケースは、画面上で実行されるスクリプトです。スクリプトのある時点では、保存する必要がある重要な変数が多いため、スクリプト自体を介してスクリプトの実行を中断しないことが非常に重要です。このスクリプトは常に定期的に実行されるわけではありません。特定の時間だけ実行してください。
スクリプトがファイルを生成したり、cronjobや他の画面などの他のタスクを生成する必要がある場合は、非常に便利です。これは単なるデザイン問題です。
ちょうど良い考えが思い浮かんだ。
difference=$(($(date -d "4:00" +%s) - $(date +%s)))
if [ $difference -lt 0 ]
then
sleep $((86400 + difference))
else
sleep $difference
fi
より良い考えがありますか?
必要に応じてより多くの情報が追加される予定です!
答え1
Teddenの提案はうまくいきますが、私の考えでは私の提案はより効果的だと思います。
difference=$(($(date -d "4:00" +%s) - $(date +%s)))
if [ $difference -lt 0 ]
then
sleep $((86400 + difference))
else
sleep $difference
fi
与えられた時間と現在の時間との差(秒)を計算します。数値が負の場合は、睡眠時間を秒単位で取得するために、1日全体(正確に86400秒)に秒数を加える必要があります。数値が正の場合はそれを使用できます。
答え2
シェルスクリプトであると仮定すると、次のように動作します。
while [ $(date +%H:%M) != "04:00" ]; do sleep 1; done
それは24時間です。このタスクを午前 4 時と午後 4 時に続行するには、次のコマンドを代わりに使用します。
while [ $(date +%I:%M) != "04:00" ]; do sleep 1; done
答え3
存在するオープンBSD、次を使用して*/5
5分のコンテンツを圧縮できます。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
分は有効な時間ではないため(そうでない限り)、電子メールレポートを受信する前に追加の時間を待つ必要はありません。
また、繰り返しの1つが割り当てられた5分より長くかかると、まったく眠らsleep
ないことで設計上寛大に失敗します。永遠に、そうすることで、割り当てられた時間内に作業を完了できます(たとえば、1回の繰り返しに5分以上かかる場合は、次の時間まで続行せずに追いつくことができる時間がまだあります)。
これprintf(1)
date
細かい仕様は2桁まで正確であると予想されるため必要です。