連載
» 2004年11月16日 19時01分 UPDATE

dev Linux シェルスクリプト集:ディレクトリ下の定期バックアップ

bash、tar、dateコマンドを利用し、cron利用で月ごとの自動バックアップスクリプトを紹介。例としてWebコンテンツディレクトリ下を例に挙げる。

[高畑年宏,ITmedia]

#!/bin/sh
cd /var/www/html
/bin/date '+/bin/tar zcvf /backup/site%y%m.tar.gz ./* >> /backup/backup%y%m.log' | /bin/sh

このスクリプトの動き

  • 1行目:#!/bin/sh

 実行するシェル指定を行う。今回はシェルの簡単なコマンド利用のみのため、多くのLinux OS系標準である/bin/shを指定している。Linuxの場合、/bin/shはbashのシンボリックリンクである。

  • 2行目:cd /var/www/html

 cdコマンドで、バックアップ元であるホームページコンテンツの格納先に移動する。Red Hatでrpmでインストールした場合、/var/www/htmlになるのが一般的である。

下記のコマンドで確認する。

# cd /var/www/html
# ls -l

 現在のコンテンツの一覧が表示されるはずである。ほかのディレクトリになっていることもあるので、可能な限りApacheの設定ファイルを確認してほしい。コンテンツのあるディレクトリでバックアップを確保すれば、仮に別ディレクトリにリストアする場合でも、相対パスでリストアされるので便利だろう。

  • 3行目:/bin/date '+/bin/tar zcvf /backup/site%y%m.tar.gz ./* >> /backup/backup%y%m.log' | /bin/sh

 実際にバックアップを行うコマンド指定である。dateコマンドでバックアップの月を指定したtarのコマンドを生成している。

 各コマンドがフルパスで記述されているのは、さまざまな環境の実行を想定するためであり、保険のためである。各コマンドのパスを確認するのは、コマンドラインで以下のように実行すればよい。

# which tar

設置場所

 基本的に、本スクリプトはどこに設置しても動作可能だ。Unixの一般的な決まりとしては、自らユーザーがインストールするものは/usr/local/下、今回のようなシェルは/usr/local/bin/に設置するという暗黙の決まりはある。

# vi /usr/local/bin/backup.sh

 などと指定して、冒頭のスクリプトをペーストすればよい(backup.shのファイル名は任意だ)。

動作環境検証〜動かすまでの手順

 スクリプトが動作する環境かどうかを確認しよう。今回のスクリプトの作成環境は以下の通りである。

  • Red Hat Linux 9.0
  • RPMでインストールされたApache
  • bashシェル
  • tar、gzip

 使用しているコマンドが基本的なものばかりなため、古いディストリビューションから最新のRed Hat Enterprise Linux、Fedora Coreなどでも問題なく動作する。シェルも、bashに限定せず、cshやtshでも構わない。

 まれにtarのzオプション(gnu zipの圧縮展開)に対応していない場合もあるが、その場合はオプションを外すなり何なりで工夫してほしい。

 なお、tarのvオプションは、バックアップ元のファイルをすべて表示する。今回はその出力をログファイルとして同じディレクトリに保管している。あとでリストアする際に、ログからファイル名の特定が行える。

 シェルの動作が確認できたら、定期的な実行のためにはcrontabに登録しよう。以下の行を、/etc/crontabに追記するだけである。

0 4 1 * * system /home/system/backup.sh > /dev/null

 上記は、毎月1日の午前4時に、systemというユーザーでシェルが実行され、バックアップ処理が行われる指定例だ。

カスタマイズのポイント

 実際にバックアップを行っている3行目を理解すれば、カスタマイズが可能だ。以下に、カスタマイズのポイントをあげてみよう。また、例として挙げているスクリプトは、Webコンテンツのバックアップとしているが、当然ながら任意のファイルが対等となり得る。

 まず、dateコマンドが作成する「シェルで実行される予定のコマンド」を、コマンドラインから実行してみよう。2004年11月のバックアップであれば、以下のコマンドが実行される。

# tar zcvf /backup/site0411.tar.gz ./*

 バックアップされるファイルが画面に次々と表示される。今回使うtarのオプションは以下の通りである。

c 新しいアーカイブファイルを作成

f アーカイブファイル名を指定

v 実行結果を表示

z アーカイブをgzipで圧縮/展開

 実行が正常終了し、プロンプトが帰ってきた段階で、バックアップ先にファイルがあることを確認する

# ls -l /backup

 dateコマンドによるバックアップコマンド自動生成。Unixのdateコマンドは、書式を指定できる。

# date '+%y%m'

 上記のコマンドを実行すると、2004年11月の場合、0411と表示される。シングルクォートの間には普通の文字列も使用できるため、下記のような使用方法も可能となる。

# date '+tar zcvf /backup/site%y%m.tar.gz ./*'

 表示結果が、先ほどのテストバックアップのコマンドとまったく同じである。これを、パイプを使ってシェルで実行すれば、実際に実効も行われる。

# date '+tar zcvf /backup/site%y%m.tar.gz ./*' | /bin/sh

 ここまでくれば、自動化は終わったも同然である。運用シェルスクリプトのコツは、「コマンドの作成」と「パイプによる実行」である。ここさえ抑えておけば、改造も思いのままである。

 また、dateコマンドを理解すれば、例えばファイル名を年月日にすることもできる。crontabの設定を変えることにより、毎日や3日ごとのバックアップに変更するのもよいだろう。

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

ピックアップコンテンツ

- PR -

注目のテーマ

マーケット解説

- PR -