シェルスクリプトで指定された時間に関数を実行するようにスケジュールする方法は?

シェルスクリプトで指定された時間に関数を実行するようにスケジュールする方法は?

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キーを用意することもできます。または、公開鍵暗号化を使用すると、バックアップが記録されているホストにバックアップの公開部分のみが必要です。

おすすめ記事