VPSサービスが再起動してたとか、サーバーのバックアップを取ることとか

プロバイダからVPSから緊急メンテナンスとして、サーバーの再起動をしましたって連絡があって、あぁそうだったんだぁと思いきや、Apacheを自動起動しないようにしていたのでWebが止まったままでした。

あはは。

そういえば、サーバーのバックアップをするスクリプトで、もしVPSがこけていたら携帯へメールするような仕組みを考えました。

なんてことはないのですが、自宅に年中動かしているWindowsクライアントがあるわけで、そいつにVPSからサーバー内のバックアップデーターを取ってきてもらいます。

ほんとは自宅のもFreeBSDやdebianがいいのですが、万一の際に家族で私以外に操作できる人がいないのも、リスクなのかなぁと思う今日この頃です。

とりあえず、gnuのwgetあたりを入れておき、サーバーからデーターを取ってきます。

[wget_file_daily.cmd]

@echo off
cd C:\www.kenti.jp
del *.tar.gz
wget ftp://[サーバーアドレス]/kentijp_allbackup.tar.gz

取ってきたら、曜日ごとにフォルダ分けしてます。
Windowsのcmdで曜日を求めるのは、こちらのページにあるバッチで日付の操作を参考にさせていただきました。

あらかじめ、01_mon , 02_tue… なんて曜日ごとのフォルダを作っておき、ダウンロードしたファイルを各々のフォルダへ振り分けます。

[copy_file_daily.cmd]

@echo off
REM 日付の曜日を求める
REM 日付はYYYY/MM/DD 形式とする。結果は環境変数 yobi へ返す。
REM 引数がないときは本日とする。

cd C:\www.kenti.jp

if "%1"=="" ( 
for /F "tokens=1" %%a in ('date /t') do set orgdate=%%a
) else (
set orgdate=%1
)

:年月日の分割
set yy=%orgdate:~0,4%
set mm=%orgdate:~5,2%
set dd=%orgdate:~8,2%
:月日の数値化(8進数対策)
set /a mm=1%mm%-100
set /a dd=1%dd%-100

if %mm% LEQ 2 (set /a yy=yy-1&&set /a mm=mm+12)
set /a ans=yy + yy/4 - yy/100 + yy/400 + (13*mm+8)/5 + dd
set /a ans=ans %% 7 
echo set day=日月火水木金土 >day.bat
echo set yobi=%%day:~%ans%,1%% >>day.bat
call day.bat

del day.bat
echo %yobi%

echo %date% %time% %yobi% >>dailylog.txt

if %yobi%==月 goto mon
if %yobi%==火 goto tue
if %yobi%==水 goto wed
if %yobi%==木 goto thu
if %yobi%==金 goto fri
if %yobi%==土 goto sat
if %yobi%==日 goto sun

goto end

:mon
copy /y .\*.gz .\01_mon\ >>dailylog.txt
if ERRORLEVEL 1 goto abend
goto end

:tue
copy /y .\*.gz .\02_tue\ >>dailylog.txt
if ERRORLEVEL 1 goto abend
goto end

:wed
copy /y .\*.gz .\03_wed\ >>dailylog.txt
if ERRORLEVEL 1 goto abend
goto end

:thu
copy /y .\*.gz .\04_thu\ >>dailylog.txt
if ERRORLEVEL 1 goto abend
goto end

:fri
copy /y .\*.gz .\05_fri\ >>dailylog.txt
if ERRORLEVEL 1 goto abend
goto end

:sat
copy /y .\*.gz .\06_sat\ >>dailylog.txt
if ERRORLEVEL 1 goto abend
goto end

:sun
copy /y .\*.gz .\07_sun\ >>dailylog.txt
if ERRORLEVEL 1 goto abend
goto end

:abend
echo file not download! >>dailylog.txt
cscript mailsend.vbs

:end

ここで、曜日ごとフォルダへファイルのコピーに失敗した場合(すなわち、wgetでファイルがダウンロードできていなかった場合)エラーとして dailylog.txtにログを残し、なおかつメールを送信するようなWSHを作成しておくと、バックアップができなかった際の異常発見が早くなると思います。

[mailsend.vbs]

Option Explicit

Sub mail_send()
Dim oMsg
Dim schemas

Set oMsg = CreateObject("CDO.Message")
schemas = "http://schemas.microsoft.com/cdo/configuration/"

oMsg.From = "example@hogehoge.ocn.ne.jp"
oMsg.To = "携帯メールアドレス"
oMsg.cc = "CCで送りたいメールアドレス"
oMsg.Subject = "kenti.jp : Backup File Download FAIL!"
oMsg.TextBody = "Backup File Download FAIL!" & vbCrLf & "Please Check ASAP!" & vbCrLf & Now

oMsg.Configuration.Fields.Item(schemas + "sendusing") = 2
oMsg.Configuration.Fields.Item(schemas + "smtpusessl") = false
oMsg.Configuration.Fields.Item(schemas + "smtpauthenticate") = 1
oMsg.Configuration.Fields.Item(schemas + "sendusername") = "username"
oMsg.Configuration.Fields.Item(schemas + "sendpassword") = "password"

oMsg.Configuration.Fields.Item(schemas + "smtpserver") = "smtp.vc*******.ocn.ne.jp"
oMsg.Configuration.Fields.Item(schemas + "smtpserverport") = 587
oMsg.Configuration.Fields.Update

oMsg.Send
End Sub

mail_send

上記は、インターネット回線にOCNを使用していて、OCNのメールアドレスから送信する場合の例です。ご参考まで。

daily.logには、バックアップが完了したり失敗すると、こんな風に記録が残るでしょう。

[daily.log]

2012/12/07 4:40:00.13 金 
.\kentijp_allbackup.tar.gz
1 個のファイルをコピーしました。
2012/12/08 4:40:00.13 土 
.\kentijp_allbackup.tar.gz
1 個のファイルをコピーしました。
2012/12/09 4:40:00.10 日 
.\kentijp_allbackup.tar.gz
1 個のファイルをコピーしました。
2012/12/10 4:40:00.11 月 
.\kentijp_allbackup.tar.gz
1 個のファイルをコピーしました。
2012/12/11 4:40:00.42 火 
.\kentijp_allbackup.tar.gz
1 個のファイルをコピーしました。
2012/12/12 4:40:00.10 水 
.\kentijp_allbackup.tar.gz
1 個のファイルをコピーしました。
2012/12/13 4:40:00.10 木 
.\kentijp_allbackup.tar.gz
1 個のファイルをコピーしました。
2012/12/14 4:40:00.10 金 
.\kentijp_allbackup.tar.gz
1 個のファイルをコピーしました。
2012/12/15 4:40:00.11 土 
.\kentijp_allbackup.tar.gz
0 個のファイルをコピーしました。
file not download! 
2012/12/16 4:40:00.40 日 
.\kentijp_allbackup.tar.gz
0 個のファイルをコピーしました。
file not download!

まぁ、こんな感じで取り急ぎはバックアップが取れてます。
Windowsのcmdファイルも頑張ればなんとかなる…でもやっぱり、/bin/sh でスクリプト書いた方がなんだか幸せな気がします。

最後に、PCへ保存したバックアップは、必ず別メディアへ保管しましょう。
今日はこれにておしまい。

One Reply to “VPSサービスが再起動してたとか、サーバーのバックアップを取ることとか”

コメントは受け付けていません。