Bashスクリプトには、スクリプトの実行時に実行する必要があるいくつかのコードと、特定の時間に実行したい関数があります。どうすればいいですか?
# Do this now
read -s -p "Password: " password
backup() {
7z ... -p$password
}
# Do this starting at 5am - how?
while true; do
backup
sleep 86400
done
見ましたが、at
マニュアルページは非常にまれであり、例はありません。どうやって整理するのかわかりません。機能。この機能を外部ファイルに抽出する必要がありますか?
これがXYの問題なら、毎朝5時にパスワードで保護されたバックアップを実行したいと思います。スクリプトの最初の部分はパスワードを要求し、read
環境変数を介してパスワードを提供するように機能します7z
。アーカイブ部分は、while true;
「毎日」部分を実装するために86400秒間休止するループに入ることができます。問題は午前5時から始まった。cron
パスワードは一度入力するよりも安全性の低いファイルに保存する必要があるため、良いオプションではないようです。
ベストアンサー1
私の計算が正しい場合:
sleep $(( 86400 + 5*3600 - $(date +%s) % 86400 ))
echo "it's 5 in the morning (UTC)"
$(date +%s)
= 1970年初め以降の現在時刻(UTC)
$(date +%s) % 86400
= 1日の一部、前の午前0時以降の秒数(UTC)
86400 + 5*3600
= 最後の深夜から明日午前5時までの秒数
86400 + 5*3600 - $(date +%s) % 86400
= 現在と5の間の秒数明日午前(UTC)
もちろん、現在時刻がUTC真夜中と目標時間の間にあり、現地時間帯に合わせて目標時間を調整する必要がある場合は中断されます。
おそらくもっと簡単なことは次のとおりです。
sleep $(( $(date -d '05:00 tomorrow' +%s) - $(date +%s) ))
真夜中が過ぎると、さらに24時間もスキップされますが、少なくとも現地時間は計算されます。
パスワードはファイルに保存する必要があるため、一度入力するよりもセキュリティが低下します。
保護するターゲットに応じて、パスワードがtmpfs
ディスクに到達しないようにメモリ内ファイルシステムにパスワードを挿入することもできます。 systemdシステムでは/run
なければなりtmpfs
ませんが、確実にすることをお勧めします。
また、バックアップの実行方法によっては、リモートでバックアップを送信するためにのみ使用できる(読み取れない)SSHキーを用意することもできます。または、公開鍵暗号化を使用すると、バックアップが記録されているホストにバックアップの公開部分のみが必要です。