運用自動化ツール

【RHEL系Linux】信頼性を重視した完了保証型ディレクトリ転送スクリプトの設計と実装

このページでは、シェルスクリプトを使って、ディレクトリ単位での安全なデータ転送を自動化する方法を解説します。

rsyncによる完全転送とmvによるアトミックなリネーム処理を組み合わせることで、処理の中断や重複転送、破壊的な上書きを防ぐ設計になっています。

ファイル単位の転送とは異なり、ディレクトリ構造を丸ごと扱うことで、業務システムのバックアップや中継処理にも柔軟に対応可能です。設計思想から具体的な実装、活用例まで、現場で役立つポイントを整理してお届けします。

ディレクトリ転送の自動化が必要な背景

サーバー運用やシステム連携の現場では、複数ファイルを含むディレクトリ単位でのデータ転送が必要になることが多いです。

特にバックアップや中間データの管理では、手動作業ではミスや転送漏れが発生しやすいため、処理の自動化が重要です。安定して一括転送できる仕組みを構築することで、運用効率と信頼性を高められます。

一括処理の安定性とログの重要性

ディレクトリ全体をまとめて転送する場合、一連の処理が確実に完了したことを確認できるログが必要です。

ログ記録により、いつ処理が開始され終了したのか、異常発生時の状況も把握できるため、運用監視やトラブル対応が容易になります。自動化スクリプトはログ出力を組み込み、安定稼働を支える土台となります。

logOut "INFO" "Starting rsync to temporary directory: $tmp_dir"
logOut "INFO" "Directory transfer completed successfully."

ファイル単位ではなくディレクトリ単位である理由

ファイル単位の転送は管理が煩雑になりやすく、整合性を保つのが難しいことがあります。対してディレクトリ単位での転送は構造が保持され、処理ミスを減らせます。

特に業務システムで扱う中間データや処理結果はディレクトリ単位で管理されるため、そのままの単位で扱うほうが現場運用に適しています。

本スクリプトは、一時ディレクトリへ完全コピーを行い、その後アトミックに正式なディレクトリ名へリネームする設計です。この手法により、途中で処理が中断しても不完全な状態が残らず、安全に運用できます。

スクリプト構成とディレクトリの前提

本スクリプトは、ディレクトリ単位での安全な転送処理を目的に設計されています。

転送元と転送先のディレクトリを指定し、コピーまたは移動の処理モードを選択できる構成です。転送先ディレクトリ内に転送元ディレクトリ名で配置され、一時ディレクトリを経由してアトミックなリネームを行うことで、処理の中断による不整合を防止しています。

引数と処理モードの定義

本スクリプトは、以下の3つの引数を受け取ります。

引数

  •  転送元ディレクトリ(-d)
  •  転送先のベースディレクトリ(-t)
  •  処理モード(-m)

処理モードは数字で指定し、0がコピー、1が移動を意味します。
引数の妥当性チェックでは、ディレクトリの存在確認やワイルドカード禁止、親子関係による危険な設定の検出も行っています。

変数と一時ディレクトリの使い分け

転送元ディレクトリのパスは変数に格納し、転送先はベースディレクトリの下に転送元名のディレクトリが作成されます。

処理中は転送先ディレクトリの隣に「.tmpdir」という一時ディレクトリを作り、rsyncで完全同期を行います。 転送完了後、一時ディレクトリを正式ディレクトリ名にリネームすることで、転送中の状態が外部から見えないように設計されています。

ログ出力とエラー制御の仕様

ログは共通のログ出力関数を利用しており、処理の各段階で開始や成功、異常の状態をログに記録します。

rsyncの終了コードやディレクトリ操作の失敗はログにエラーとして残し、異常時にはスクリプトを終了させる制御が実装されています。 これにより運用時の監視やトラブルシュートがしやすくなっています。

変数名説明
src_dir転送元ディレクトリのパス
dst_dir転送先のベースディレクトリのパス
mode処理モード(0=コピー、1=移動)
src_base転送元ディレクトリの末尾の名前部分
dst_base転送先のベースディレクトリ配下の転送元ディレクトリ名の完全パス
tmp_dir転送先の一時ディレクトリパス(dst_base.tmpdir)

処理フロー全体の構造

本スクリプトは、処理の流れを事前処理(pre-process)、メイン処理(main-process)、事後処理(post-process)の3段階に分けて設計されています。

各段階で必要なチェックや操作を明確に分離することで、堅牢で保守しやすい構造になっています。特にメイン処理ではrsyncを用いたディレクトリの完全同期と、その後のアトミックなリネーム処理によって安全性を確保しています。

pre-processでの引数チェックと事前ログ

事前処理では、引数の受け取りと妥当性チェックを行います。 ここで転送元ディレクトリ、転送先ディレクトリ、処理モード(コピーか移動か)が正しく指定されているか検証します。

ワイルドカードの禁止や、親子ディレクトリ構造の不正検出もこの段階で行い、不正な条件ではスクリプトを終了させます。 また、開始時のログ出力により処理の起点を記録します。

logOut "DEBUG" "src=/path/to/src, dst=/path/to/dst, mode=0"

main-processでのrsyncとアトミックなmv処理

メイン処理では、まず転送先の一時ディレクトリ(例: dst_base.tmpdir)に対してrsyncを用いて完全な同期を行います。 この同期はチェックサム比較と削除オプションを使い、転送元と転送先を完全に一致させます。

rsync --checksum --delete -av "$src_base/" "$tmp_dir/"

同期が成功した後は、既存の正式ディレクトリがあれば削除し、一時ディレクトリを正式ディレクトリ名にリネームします。
このリネーム操作はアトミックで行われるため、転送途中の不整合が外部に見えない設計です。

mv -f "$tmp_dir" "$dst_base"

処理モードが移動の場合は、転送元ディレクトリを削除して処理を完結させます。

rm -rf "$src_base/"

post-processでの後処理と成功ログ出力

事後処理では、処理の正常終了をログに記録します。 このログ出力は運用監視やトラブル解析に役立ち、スクリプトの信頼性を高めます。 異常時はメイン処理段階で即座にログを残して終了するため、ここでは成功時のメッセージのみ記録されます。

logOut "INFO" "Directory transfer completed successfully."

基本的な使い方と注意点

このセクションでは、ディレクトリ単位での転送スクリプトの基本的な使い方と、運用時に注意すべきポイントについて解説します。コピーと移動の違いや誤操作防止の工夫、さらに応用的な活用例を紹介します。

前提となる実行環境

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

実行環境

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

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

ディレクトリ転送スクリプト

ディレクトリ転送スクリプトの全体コードを以下に掲載します。処理の流れや各部分の役割を理解しやすいよう、構造的に記述されたスクリプトです。実際の運用やカスタマイズの参考にしてください。

コピーと移動の違いを活かした運用パターン

転送スクリプトは、処理モードとしてコピー(0)と移動(1)を指定できます。

コピーの場合は転送元のディレクトリはそのまま残り、転送先に内容が複製されます。これにより、バックアップや検証用の複製を作成する用途に適しています。 移動の場合は転送元のディレクトリが削除されるため、処理対象を明確に切り替えたい場面で効果的です。

sh script.sh -d /path/source -t /path/destination -m 0 # 転送元のディレクトリはそのまま残る

sh script.sh -d /path/source -t /path/destination -m 1 # 転送先に内容が複製されたら元ディレクトリを削除する

誤操作防止のための設計上の工夫

スクリプトでは、転送元と転送先の親子関係を厳格にチェックし、不正なディレクトリ指定による破壊的な動作を防止しています。 また、ワイルドカードの使用を禁止することで、予期せぬファイルやディレクトリの転送を避けています。 これらの制御により、安全に運用できる仕組みが整っています。

応用例:バックアップやテスト環境との連携

本スクリプトはバックアップ処理やテスト環境への同期など多様な用途に活用可能です。 たとえば、業務データを定期的に別サーバーへコピーして障害時のリカバリに備えたり、開発環境での検証用データを同期したりすることができます。 安全なアトミック処理により、データの整合性を確保しつつ効率的な運用を実現します。

本サイトにて記載のすべてのスクリプト利用により発生した利用者の損害全てに対し、いかなる責任をも負わないものとし、損害賠償をする一切の義務はないものとします。また、この記事は、実際の案件対応を通じて得た知見をもとに筆者が作成したものであり、全コードと解説は著者本人による設計・検証結果に基づいています。

よく読まれている記事

1

「シェル」と「シェルスクリプト」という言葉を聞いたことがありますか?どちらもLinuxやMacのターミナルで使われるものですが、それぞれの役割や使い方には違いがあります。 本記事では、「シェル」と「シ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか? 無料で使えるだけでなく、高い柔軟 ...

3

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

-運用自動化ツール