Shell の基礎知識

【Shell-Tips】一部のファイルやディレクトリを除外してバックアップを取得する。

2021年3月17日

開発現場で最も重要度の高いシェルスクリプトは、やはりバックアップ関連でしょう。作成中の環境設定やスクリプトなど、デグレや紛失から守るために、定期的に他のディスクへ退避することが求められます。

対象ファイルが1つや2つ程度なら手動で退避することも考えられますが、他のエンジニアとの共同作業の場合、定義ファイルや設定ファイル、実行スクリプトなど‥所定のディレクトリを定期的にバックアップすることをお勧めします。手動作業ではとても追いつきません。

この記事では、外部ファイルにて指定されたファイルを圧縮して退避するスクリプトを作成します。実行スケジュールはクーロンを想定しています。

実行スクリプト環境の準備

バックアップを行うスクリプトは、これまで作成してきたロジックを組み合わせて作成していきます。

簡単な仕様

  1. 想定するバックアップ対象
    1. ディレクトリ(サブディレクトリ含む)
    2. ファイル(ワイルドカード指定可)
  2.  対象の指定・除外選択を可能とする
    1. 対象指定外部ファイル名:backupFiles.target
    2. 除外指定外部ファイル名:buckupFiles.ignore
  3. エラーハンドリング
    1. バックアップの失敗を検知するため、エラーはシスログへ出力する
  4. メッセージ出力
    1. 外部ファイルより取得し所定のログファイルへ出力する。

前提

Beエンジニアでシェルスクリプトを実行する環境は下記の通りとします。

実行環境

BASE_DIR(任意のディレクトリ)

  • scripts
    • bin(実行スクリプト格納領域)
      • func.sh (実行ファイル)
    • com(共通スクリプト格納領域)
      • comFunc.shrc(共通関数定義ファイル)
    • etc(設定ファイル等の格納領域)
      • message.conf(メッセージ定義ファイル)
    • log(スクリプト実行ログの格納領域)
      • スクリプト名.log 
    • tmp(テンポラリ領域)
    • rep(レポート出力領域)

バックアップ対象ファイルの準備

バックアップの実行環境として「/root/」直下へ「test」ディレクトリを想定しています。

上記ディレクトリ構成のうち、赤枠内をバックアップ対象とし、定期的にファイルを指定ディレクトリへ退避します。なお、退避する必要のないファイルは別途、除外設定ファイルへ除外対象を記入することにより、バックアップの対象から除外するものとします。

外部ファイルの作成

取得対象となるファイル・ディレクトリ及び、除外対象となるファイル・ディレクトリを指定します。今回はバックアップの対象から一部の「ファイル」や「ディレクトリ」を除外して対象をバックアップします。また、対象がファイルの場合はそのまま、ディレクトリの場合は「tar.gz」形式にアーカイブして指定格納領域へ格納します。

[ <BASE_DIR>/scripts/etc/backupFiles.target.list ]

取得対象ファイルorディレクトリ

/root/test1
/root/test/test2/test2-1
/root/test/test2/test2-3/test2-3.txt

[ <BASE_DIR>/scripts/etc/backupFiles.ignore.list ]

除外対象ファイルorディレクトリ

test1-1*

メッセージ定義ファイルの作成

出力するメッセージは外部ファイルからメッセージIDを元に取得するものとします。

I-00000番台:INFOMATION(情報) 今回は未使用
W-00000番台:WARNING(警告)
E-00000番台:ERROR(エラー)

[ <BASE_DIR>/scripts/etc/message.conf ]

message.conf

# Warning messages
W-00001 user.warn "The number of arguments is incorrect."
W-00002 user.warn "The target file or target directory cannot be found."
W-00003 user.warn "There is an error in the option specification."
W-00004 user.warn "The target does not exist. Skip"

# Error messages
E-00001 user.err "Lock failed due to multiple startup."
E-00002 user.err "Failed to unlock."
E-00003 user.err "Failed to copy the file."

実行シェルの作成

ワイルドカード指定の場合は、指定ファイルを検索してコピーを行います。

多重起動禁止処理

多重起動禁止処理を設定します。詳細については下記リンクページを参照ください。

ファイルバックアップ処理

ファイルのバックアップロジックを実装します。バックアップは下記の観点3つを考慮し実装します。

ポイント

  • 取得対象の指定にワールドカードが指定された場合
  • 取得対象がファイルの場合
  • 取得対象がディレクトリの場合

本スクリプトのログ出力は「スクリプト名+.log」ファイルへ出力します。

監視設定の観点からシスログへの出力を組み込む場合、下記のリンクを参照ください。

ワイルドカード指定の処理

取得対象ファイルに「/取得対象ファイル*」の様に「*(ワイルドカード)」が指定された場合の処理を行います。

ワイルドカードで指定されたファイルは、原形のまま(アーカイブ化せず)そのまま引数で指定された格納先ディレクトリへ格納します。

ファイル・ディレクトリのバックアップロジック

取得対象がファイルの場合、原形のまま(アーカイブせず)そのまま引数で指定された格納先ディレクトリへ格納します。取得対象がディレクトリの場合、対象ディレクトリを圧縮(アーカイブ化)して、引数で指定された格納ディレクトリへ格納します。

取得対象がディレクトリの場合、パスに含まれる「/(スラッシュ)」を「_(アンダースコア)」へ変更しアーカイブ名としています。

実行スクリプト

バックアップ処理を実行ファイルへ組み込みます。

本スクリプトでは、取得対象となるファイル or ディレクトリが存在しない場合、警告ログを出力し処理をスキップします。(停止はしません)

実行結果

作成したスクリプトを実行します。

[ 実行結果 ]

バックアップスクリプトを実行した結果、一部のファイルやディレクトリを除外してバックアップ対象が取得されています。
 本スクリプト利用により発生した利用者の損害全てに対し、いかなる責任をも負わないものとし、損害賠償をする一切の義務はないものとします。

よく読まれている記事

1

目次1 Shellとは?1.1 代表的なシェルの種類2 シェルスクリプトの違いとは? Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロ ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Shell の基礎知識

Copyright© Beエンジニア , 2021 All Rights Reserved.