【cmd】毎日決まった時間にバックアップし、一定期間経つと削除する方法
毎日自動でバックアップする方法
目次
作るきっかけ
前の記事でローカルにGiteaを立ち上げてたのですが、さすがにバックアップはしておこうということで自動でバックアップする方法調べました。
ただ、無尽蔵のバックアップしてもストレージを圧迫するだけなので、一定のバックアップ個数になると古いものを消すような細工をしたいと思います。
なおこの記事はGiteaのバックアップを前提に書いていますが、普通のバックアップにももちろん使用できます。
windowsはタスクスケジューラで自動化できる
あまり使っている方は少ないかもしれませんが、windowsにはタスクスケジューラという便利ツールが最初からインストールされています。
これを使用することで特定のタイミングでbatを走らせたりできます。
今回の場合は
- Giteaのサーバーをシャットダウンする
- Giteaのデータをバックアップする
- 古いバックアップを削除する
- Giteaのサーバーを再起動する
これを毎日自動的にやらせます。
bat作成
では実際に自動化するためのbatを作成してみます。
なお通常のバックアップの場合は、サーバーのシャットダウン、再起動の部分は飛ばして問題ありません
Giteaのサーバーをシャットダウンする
Giteaを立ち上げたままだとコピーできないので、最初はサーバーを落とす必要があります。
そのbatファイルはこのように書きます。
「Gitea」の部分はサービスに登録されている名前です。
ServerShutdown.bat
1sc stop Gitea
Giteaのデータをバックアップする
次に実際にバックアップを取ります。
今日の日付を取得して、20210620
のようなフォルダを作成しそこにコピーしてきます。
※バックアップするフォルダとバックアップ先のパスを設定してください
Backup.bat
1echo off
2set now=%date:/=%
3rem コピー元
4Set SourcePath=C:\foo
5rem コピー先
6Set CopyToPath=D:\bar\GiteaBackup\%now%
7robocopy /e /xo "%SourcePath%" "%CopyToPath%"
古いバックアップを削除する
今度は古いバックアップを削除するbatです。
バックアップしている親ディレクトリを設定して、count
で残して置く個数を設定しておきます。
DelOldBackup.bat
1echo off
2rem バックアップしているディレクトリ
3set BackupDir=D:\bar\GiteaBackup
4rem 保存するファイル世代の数
5set count=10
6cd %BackupDir%
7for /f "skip=%count%" %%f in ('dir "%BackupDir%" /b /ad /o-n') do (
8 rmdir rd /s /q "%BackupDir%\%%f"
9)
これについて少し解説しておくと
dir "%BackupDir%" /b /ad /o-n
はBackupDirにあるフォルダを降順で列挙します。
つまり202106020, 202106021, 202106022
のフォルダがあれば
1202106022
2202106021
3202106020
のように列挙されす。
それをcount
で設定した分だけスキップして、for文内にあるrmdir
のディレクトリ削除を行うので
count
で設定したバックアップ数より多い場合、古いフォルダが削除されるということになります。
Giteaのサーバーを再起動する
最後にGiteaを再起動します。
ServerBoot.bat
1sc start Gitea
スケジュールを登録する
タスクスケジューラはスタートからでもできますが、GUIだと面倒なのでこれもcmdでやってしまいましょう。
先ほど作成したbatファイルをバックアップしているディレクトリに置きます。
イメージとしてはこんな感じ
1GiteaBackup
2 ├20210620 ─ バックアップデータ
3 ...
4 ├Backup.bat
5 ├DelOldBackup.bat
6 ├ServerBoot.bat
7 └ServerShutdown.bat
そして新たに以下のようなbatファイルを作成し、バックアップ頻度や時間を指定(後述)を修正、完成したら管理者として実行
で実行します。
TaskAdd.bat
1echo off
2set batDir=D:\bar\GiteaBackup\
3schtasks /create /tn "Giteaシャットダウン" /tr "%batDir%ServerShutdown.bat" /sc DAILY /st 12:05 /rl highest /F
4schtasks /create /tn "Giteaバックアップ" /tr "%batDir%Backup.bat" /sc DAILY /st 12:06 /rl highest /F
5schtasks /create /tn "Gitea旧バックアップ削除" /tr "%batDir%DelOldBackup.bat" /sc DAILY /st 12:09 /rl highest /F
6schtasks /create /tn "Gitea再起動" /tr "%batDir%ServerBoot.bat" /sc DAILY /st 12:10 /rl highest /F
7pause
なにも問題なければタスクスケジューラに登録されています。
意味を解説すると
schtasks /create
でタスクスケジューラに新規登録
/tn "Giteaシャットダウン"
でタスク名を設定
/tr "%batDir%ServerShutdown.bat"
で実行するものを設定
/sc DAILY
(1日ごと)で実行頻度を設定
これには他にも、HOURLY
(1時間ごと),WEEKLY
(一週間ごと),MONTHLY
(1か月ごと)などがあります
/st 12:05
で実行する時間を指定
自分は12:00から昼休みなので、
12:05にサーバーをシャットダウン->12:06にバックアップ->12:09に重複削除、12:10にサーバー再起動としています。
これはお好みで弄ってください。
/rl highest
で管理者として実行します。サービスの停止/実行には管理者実行が必要です。
/F
同名のタスクがある場合は上書きします。
指定した時間に実行されれば成功です。
これで万が一メインPCがぶっ壊れてもGiteaのリポジトリは生存できる状態になりました。