
毎週金曜日の夜にバックアップを実行したいです (これはバックアップ ルーチンのすべてではなく、その一部です)。毎週金曜日の夜のバックアップは、4 週間後まで上書きされません。つまり、基本的に、週 1、週 2、週 3、週 4 の 4 つの循環バックアップがあります。
さて、week1のバックアップスクリプトを4週間ごとに実行する必要があります。しかし、week2のスクリプトも4週間ごとに実行する必要があります。crontabにX週間/日/時間/その他ごとに何かを実行するように指示できることはわかっています。しかし、これら4つのスクリプトをそれぞれ別の週に実行するように設定するにはどうすればよいのでしょうか。4つのスクリプトがすべて同じ夜に実行され、その後何週間も待ってから実行されてしまうのを避けるにはどうすればよいでしょうか。全て再実行?
答え1
このような複雑なバックアップ ルーチンを設計する代わりに、エンタープライズ クラスの無料のオープン ソース ソフトウェアである Bacula の使用を検討してください。Bacula は非常に柔軟性が高く、ほぼあらゆる方法でバックアップ ジョブを自動化できます。
たとえ手動ソリューションを作成できたとしても、それには多くの欠点があります。
- 追跡エラーは大きな問題となる
- 仕事の追跡は頭痛の種になるだろう
- 手動設定では常に継続的な監視が必要
最高のシステム管理者とは、すべてを自動化して、あとはのんびりと座っている人です。
答え2
Frank の回答が最善だと思いますが、説明どおりに実行するには、毎週金曜日にバックアップを実行する cronjob を作成し、log rotate を使用して最後の 4 つのコピーを保持します。または、4 週間以上前のバックアップを検索するようにします。
答え3
代替案の 1 つは、スクリプトに複雑さを組み込むことです。スクリプトは cron よりもその種の複雑さをうまく処理できます。つまり (bash を想定)、次のようになります。
- cron ジョブで毎週金曜日に同じスクリプトを実行するようにします。
- スクリプトを変更して、エポック以降の週の 4 を法として計算します。
(フォーマットの問題なので、ここにダミーテキストを入れる必要があります)
epochsecs=`date +%s` # second since epoch
そして
weeknum=`expr $epochsecs / 86400 / 7 % 4` # weeks since epoch, modulo 4
その番号をバックアップ ファイル名の一部として使用します。
バックアップファイル=/path/to/backup/file.$weeknum
古いバックアップファイルを上書きします。
rm $backupfile tar czvf $backupfile /bunch/of /directories
あるいは、日付が付いたファイル名サフィックスを使用することもできます。
backupfile=/path/to/backup/file.`date +%Y-%m-%d`
次に、スクリプト内で find を実行して、28 日より古いバックアップ ファイルを削除します。
find /path/to/backup -maxdepth 1 -ctime +28 -delete
いずれにせよ、このような複雑さで cron に過度の負担をかけないでください。スクリプトで処理すると、おそらくスクリプトの方が複雑さをより適切に処理できます。
答え4
2つの選択肢:
- 毎週金曜日に実行するようにスクリプトをスケジュールし、最後に実行されたジョブを追跡し、シーケンス内の次のジョブを実行します。
または:
- week1 をその月の 1 日から 7 日までの金曜日のみ実行するようにスケジュールします。
- week2 をその月の 8 日から 14 日までの金曜日のみ実行するようにスケジュールします。
- ... 等々。
- これでは完璧バックアップ - 1 週間のバックアップが取れない場合があります (29/30/31 日が金曜日の場合)
このような考え方こそが、楽しいすべてを自分で行うのと同じように、AmandaやBaculaなどの適切なバックアップツールを使用すると、さらに先に進むことができます。フランクは提案する。