2017-01-16

tobijibu

バックアップファイルを定期的にダウンロードする

定期バックアップスクリプトを作成しましたが、バックアップファイルは、Redmineが稼働しているサーバへ残しているだけです。サーバはいつ壊れるか分かりませんので、バックアップを別の場所へ残しておきたいところです。

サーバが複数台あるのであれば、1台が壊れても何とかなりますし心強いのですが、社内ツール用のサーバではなかなかそうもいきませんよね。

ローカルに落としてくるとしても、Macや、Linuxであればrsyncコマンドを使ってファイルを落とすこともできますが、Windowsだとrsyncコマンドが使えません。
※Windows10だと使えるのでしょうか?未検証です。

現場ではWindows7を使っているので、Windows上で定期的にバックアップファイルをダウンロードする仕組みを作ってみます。Windows上でシェルが使えることが前提です。ここではmsys2を利用して説明します。

ファイルダウンロードスクリプト

サーバ上で生成したバックアップファイルをダウンロードするスクリプトを作成します。

scpコマンドでサーバ上のファイルをダウロードします。scpコマンドは以下で実行することができます。

scp -i <秘密鍵パス> -r <ユーザー名>@<IPまたはドメイン>:<サーバ上のファイル、ディレクトリ> <ローカルダウロード場所>

実際には以下のように記述します。Windowsでmsys2を使う場合、Cドライブのパスは/c/で始まるパスを指定します。

# バックアップディレクトリにあるファイルをローカルディレクトリにまとめてダウンロード
scp -i ~/.ssh/tobijibu.ppk -r tobijibu@192.168.1.105:/home/tobijibu/redmine /c/Users/tobijibu/_bkups

sshコマンドで接続し、ダウンロードしたファイルを別のディレクトリへ移動します。スクリプト内でsshコマンドで接続し、サーバ上でコマンドを使うには以下の方法で行います。

ssh <ユーザー名>@<IPまたはドメイン> -i <秘密鍵パス> "<コマンド>"

ここではリストアスクリプトで利用するディレクトリへ移動するようにしてありますが、不要であれば削除して構いません。

# バックアップ済みのファイルを別のディレクトリへ移動(削除しても良い)
ssh tobijibu@192.168.1.105 -i ~/.ssh/tobijibu.ppk "mv /home/tobijibu/redmine/* /home/tobijibu/redmine_bkups"

今回説明で利用したソースはこちらにあります。

タスクスケジューラの設定

Windows上で定期的にコマンドを実行する方法として、タスクスケジューラというツールがあります。今回はこのタスクスケジューラを使います。操作はWindows7での説明となりますが、Windows8、Windows10でもあまり変わらないと思います。

1. タスクスケジューラを開く

すべてのプログラムからアクセサリ→システムツールを開き、「タスクスケジューラ」を開きます。タスクスケジューラウィンドウが開きます。

2. タスクの作成

タスクスケジューラウィンドウの右メニューにある「タスク作成」を開きます。タスクの作成ウィンドウが開きます。

3. 設定

「全般」タブでは「名前」、「説明」を入力します。ウィンドウ下部の"最上位の特権で実行する"にチェックを入れます。

「トリガー」タブでは実行タイミングに応じて設定してください。「新規」ボタンを押すと設定ウィンドウが表示されます。

ここでは"毎日"、"9:02"に開始して、"3時間"毎に実行するように設定しました。また、"繰り返し継続時間の最後に実行中の全てのタスクを停止する"のチェックを入れています。

「操作」タブでは実行するスクリプトを設定します。「新規」ボタンを押すと設定ウィンドウが表示されます。

ここはいちばん重要な設定ですが、入力項目名と入力内容の意味合いが似ているため少し分かりづらい設定です。私も一番悩みました。

今回はshellscriptを設定するので、「操作」は"プログラムの開始"を選択します。

「プログラム/スクリプト」はスクリプト本体ではなく、シェルの実行ファイルを指定します。今回は下記です。

C:\msys64\usr\bin\sh.exe

「引数の追加(オプション)」にはスクリプト本体のパスを指定します。先ほど説明したスクリプトのパスなので、今回は下記のように指定しました。

C:\Users\tobijibu\bkup_dl.sh

「開始(オプション)」にはシェルの実行ファイルが格納されているディレクトリを指定します。「プログラム/スクリプト」が格納されたディレクトリパスで良いと思います。

C:\msys64\usr\bin\

ここまで設定したら「OK」を押し、設定ウィンドウを閉じます。

新たにタスクが追加されているので、そのタスクを試しに実行してみましょう。

「タスクスケジューラライブラリ」を選択すると、タスク一覧が表示されます。その中に、今回作成したタスクがありますので、そのタスクを選択し、右メニューから「実行」をクリックします。

タスクの「履歴」タブを開き、エラーが表示されておらず、"タスクが完了しました。"とメッセージが表示されていれば、タスクは問題無く動いています。

次に、バックアップをダウンロードするディレクトリを確認し、バックアップファイルが保存されていれば、スクリプトも正常に動いています。

Windowsでもシェルとタスクスケジューラを使うことで、cronのようなことが出来ることを説明しました。3回に渡りshellscript作成を紹介したのは、今回の方法を紹介したかったというのが一番の理由です。是非活用してみてください。