Shell-Tips

【Shell-Tips】共通関数定義クラスの完全ガイド!設計から実践まで徹底解説

共通関数定義クラスの概要と役割

共通関数定義クラス(utils.shrc)は、シェルスクリプト開発において頻繁に使用される汎用的な関数をまとめたスクリプトです。これを活用することで、スクリプトごとに重複したコードを書く必要がなくなり、開発の効率化や保守性の向上を実現できます。

特に、シェルスクリプトはプロジェクトが大規模になるにつれて管理が複雑になりがちです。utils.shrcを導入することで、スクリプト間の一貫性を保ちつつ、共通機能を統一した形式で提供できます。

共通関数定義クラスの目的

共通関数定義クラスの主な目的は、以下の3つに集約されます。

目的

  1. コードの再利用性向上
    頻繁に使用する関数を集約し、各スクリプトで共通化することで、コードの重複を削減します
  2. 保守性の向上
    修正が必要な場合、共通関数定義クラスを更新するだけで全スクリプトに適用されるため、保守作業を簡素化できます。
  3. 可読性の向上
    共通関数を利用することで、各スクリプトがシンプルになり、他の開発者がスクリプトを理解しやすくなります。

共通関数定義クラスの適用範囲

共通関数定義クラスは、以下のような用途で活用できます。

活用用途

  • ログ処理の統一
    メッセージの出力を標準化し、ログの記録方法を統一する。
  • エラーハンドリング
    予期しないエラー発生時に適切なメッセージを出力し、スクリプトの異常終了を制御する。
  • ファイル操作の簡素化
    一時ファイルの作成・削除、ディレクトリの作成・移動といった操作を統一する。
  • プロセス管理
    プロセスの状態チェックや重複実行の防止機能を提供する。
  • 環境変数の管理
    必要な環境変数の初期化や取得を一元管理し、スクリプトごとの設定ミスを防ぐ。

このように、システム管理やバッチ処理など、さまざまなシェルスクリプトに適用できます。

共通関数定義クラスの設計の基本方針

共通関数定義クラスは、以下の基本方針に基づいて設計されています。

基本方針

  1. シンプルで汎用的な関数の提供
    • 特定のスクリプト専用の関数ではなく、複数のスクリプトで再利用可能な設計を重視。
  2. 依存関係の最小化
    • 外部ツールや特定の環境に依存しないようにし、ポータビリティを確保。
  3. エラーハンドリングの標準化
    • すべての関数で適切なエラーハンドリングを実装し、異常時の動作を統一。
  4. パフォーマンスを考慮した設計
    • シェルスクリプトの特性を活かし、無駄なプロセスの生成や処理の遅延を最小限に抑える。
  5. 一貫した命名規則の適用
    • 変数や関数名の命名規則を統一し、可読性と保守性を向上。

これらの方針に基づいて設計することで、utils.shrcは柔軟かつ堅牢な共通関数クラスとして機能します。

設計書の構成と設計要素

共通関数定義クラス(utils.shrc)は、シェルスクリプトにおける汎用的な処理をまとめた関数群を提供するものです。本章では、その設計の前提条件、関数のスコープ管理、そして実装されている主要な関数について解説します。

クラス設計の前提条件

共通関数定義クラスは、シェルスクリプトの汎用的な処理を統一するために設計されています。そのため、以下のような前提条件を設定しています。

前提条件

  1. 関数ベースの設計
    • 共通関数定義クラス は、単体で実行するスクリプトではなく、他のスクリプトから source で読み込まれる ことを前提としています。
    • すべての処理は関数として定義されており、直接スクリプトに影響を与えることはありません。
  2. スコープの明確化(グローバル変数なし)
    • グローバル変数は一切使用しない 設計となっています。
    • 各関数の内部で local を利用し、関数外に影響を与えないように管理。
  3. エラーハンドリングと戻り値の統一
    • すべての関数は 0(成功)、1(失敗) など統一された戻り値を持つ。
    • 標準エラー出力(stderr)へエラーメッセージを出力する場合は、logOut 関数を利用。
  4. 外部依存の最小化
    • OSに依存しないよう、可能な限り POSIX準拠 のコマンドを使用。
    • grep, awk, sed, find など、シェルスクリプトで一般的なツールの利用は許容
  5. 排他制御とプロセス管理
    • acquireLock と releaseLock の関数を用意し、同時実行を制限できる設計。
    • ロックファイルの所有権を適切に管理する。

関数のスコープ管理と設計方針

utils.shrc では、すべての関数において ローカルスコープ(local 変数) を徹底し、グローバル変数の使用を避ける方針を採用しています。

スコープ管理の基本ルール

  • すべての関数で local を使用する

関数内でのみ有効な変数として local を明示的に使用し、他の関数やスクリプトに影響を与えないようにする。

sampleFunction() {
    local var="This is a local variable"
    echo "$var"
}

  • 関数間の影響を最小限にする

必要なデータは関数の引数で受け渡し、戻り値で結果を返す設計を採用。

isEmpty() {
    [[ -z "$1" ]]
}

  • ロックファイルの利用

排他制御を適切に管理するために、関数内でのみロックファイルを参照し、不要になったら適切に解放する。

releaseLock() {
    if [ -f "$LOCK_FILE" ]; then
        local locker=$(cat "$LOCK_FILE" 2>/dev/null)
        if [ "$locker" = "$$" ]; then
            rm -f "$LOCK_FILE"
            logOut "INFO" "Lock released: [$LOCK_FILE]"
        else
            logOut "WARN" "Lock file exists, but owned by PID [$locker], not [$$]."
        fi
    fi
}

実装されている関数の詳細

共通関数定義クラス(utils.shrc)には、シェルスクリプトの開発を効率化するための汎用的な関数が実装されています。以下に、関数の一覧を示します。

関数名概要引数戻り値
releaseLockスクリプトの多重実行を防ぐためにロックを解除する。なし0: 成功(ロック解除)
1: 失敗(ロックが存在しない)
acquireLockスクリプトの多重実行を防ぐためにロックを取得する。なし0: 成功(ロック取得)
1: 失敗(他のプロセスがロック中)
setUTF8言語環境変数(LANG)を UTF-8 に設定する。なしなし
setSJIS言語環境変数(LANG)を Shift-JIS に設定する。なしなし
setLANGスクリプトを特定のユーザーで実行する。$1: 設定する LANG の値(デフォルト: C)なし
runAsroot ユーザーでスクリプトを実行する。$1: 実行ユーザー(デフォルト: root)
$2-: スクリプトに渡す引数
なし(指定ユーザーで再実行)
runAsRootスクリプトを root ユーザーとして実行する。なしなし(root ユーザーで実行)
abortエラーメッセージを記録し、スクリプトを終了する。$1: エラーメッセージなし(exit 1 で終了)
getMd5Sum指定したファイルの MD5 ハッシュ値を取得する。$1: ファイルパスMD5 ハッシュ値(標準出力へ出力)
getProcessCount指定したプロセスの数をカウントする。$1: プロセス名プロセス数(標準出力へ出力)
isAlphaNum文字列が英数字のみで構成されているかを判定する。$1: チェック対象の文字列0: 英数字 / 1: 非英数字
isNumeric文字列が数値であるかを判定する。$1: チェック対象の文字列0: 数値 / 1: 非数値
isPortAlive指定したポートがリスニング状態にあるかを確認する。$1: ポート番号0: LISTEN / 1: 非LISTEN
checkProcessCount指定したプロセスの実行数が指定範囲内であるかを確認する。$1: プロセス名
$2: 最小数
$3: 最大数
0: 範囲内 / 1: 少なすぎ / 2: 多すぎ
backupFileファイルをバックアップする(タイムスタンプ付き)。$1: バックアップ対象ファイルなし
deleteOldFiles指定したディレクトリ内の古いファイルを削除する。$1: ディレクトリパス
$2: 保持日数
なし
isHostAlive指定したホストがネットワーク上で到達可能かを確認する。$1: ホスト名0: 到達可能 / 1: 不可
confirmAction重要な操作の前にユーザーへ確認を求める。$1: 確認メッセージ0: 承諾 / 1: 拒否
checkCommandExistsスクリプトで必要なコマンドがシステムに存在するかを確認する。$1: コマンド名0: 存在 / 1: 不存在
isKeywordInProcess指定したキーワードがプロセス一覧に含まれているかを確認する。$1: キーワード0: 発見 / 1: 未発見
getCurrentTimestamp現在のタイムスタンプを取得する(YYYY-MM-DD_HH-MM-SS)。なしタイムスタンプ(標準出力へ出力)
formatDate指定した日時をフォーマット変換する。$1: 日時(YYYYMMDD-HHMMSS)フォーマット済み日時(標準出力へ出力)

共通関数定義クラスの導入手順

共通関数定義クラス(utils.shrc)を使用するための手順について説明します。これにより、シェルスクリプトにおける汎用的な関数を再利用し、効率的な開発が可能になります。

前提となる実行環境

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

実行環境

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

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

共通関数定義クラス(utils.shrc) を正常に動作させるためには、以下の実行環境が整っている必要があります。

  • シェル環境: Bash 4.x 以上を推奨。utils.shrc は Bash を前提として設計されています。
  • ファイルシステムへの書き込み権限: スクリプトがロックファイルや一時ファイルを操作するため、実行するディレクトリへの書き込み権限が必要です。
  • 依存ツール: 一部の関数は grepawksed などの標準的なツールを使用します。これらのツールがシステムにインストールされていることを確認してください。

本スクリプトの利用により生じた、いかなる損害についても一切の責任を負わないものとします。また、損害賠償等の義務ついても、一切責任を負いません。

共通関数定義クラスの導入方法

共通関数定義クラス(utils.shrc)は、以下のコードをプロジェクトにコピーし、シェルスクリプトで使用できるように設定します。
まず、下記のコードを utils.shrc としてファイルに保存してください。

本スクリプトの利用により生じた、いかなる損害についても一切の責任を負わないものとします。また、損害賠償等の義務ついても、一切責任を負いません。

  1. utils.shrc を取得する
    utils.shrc ファイルをプロジェクトディレクトリにコピーします。通常は scripts/com/ ディレクトリに配置します。

    cp utils.shrc /path/to/your/project/scripts/com/

  2. 他のシェルスクリプトから source で読み込む
    他のシェルスクリプト内で共通関数を利用するためには、source コマンドを使用して utils.shrc を読み込みます。

    source /path/to/your/project/scripts/com/utils.shrc

  3. 関数を利用する
    utils.shrc 内の関数は、スクリプト内でそのまま呼び出すことができます。例えば、getCurrentTimestamp 関数を使用するには次のように記述します。

    timestamp=$(getCurrentTimestamp)
    echo "Current timestamp: $timestamp"

  4. 動作確認
    導入後、シェルスクリプトを実行して関数が正常に動作するかを確認します。エラーハンドリングやログ出力が適切に機能していることをチェックしてください。

この手順を参考にして、共通関数定義クラスをプロジェクトに導入し、スクリプト開発を効率化してください。

実践的な利用方法とサンプルコード

 utils.shrcは、シェルスクリプトでよく使われる便利な機能を集めた共通関数集です。これにより、日常的に行うタスクを簡素化し、効率的なスクリプト作成が可能になります。このセクションでは、utils.shrcの関数を実際にどのように活用するかを示すため、いくつかの実践的な利用方法とサンプルコードを紹介します。

utils.shrcには、ファイルバックアップやポートの状態確認、プロセス数の管理など、システム管理で役立つ多くの関数が含まれています。例えば、定期的なバックアップを自動化したり、ネットワークサービスが正常に稼働しているかどうかを簡単にチェックすることができます。これにより、手動で行う作業を減らし、エラーのリスクを低減することができます。

次に、utils.shrcを利用した具体的な使用例を紹介し、どのようにしてシェルスクリプト内でこれらの関数を活用できるかを見ていきましょう。

基本的な使い方

共通関数定義クラス(utils.shrc)を使用するには、まずそのファイルをプロジェクトに取り込み、source コマンドで読み込みます。その後、クラス内で定義された関数を簡単に利用することができます。

よくある利用ケース

共通関数定義クラスは、システム管理やバッチ処理など、さまざまな場面で活用できます。以下は、よくある利用ケースの一例です。

  • プロセス管理
    getProcessCount を使用して、指定したプロセスが実行中かどうかを確認することができます。例えば、バックグラウンドで実行しているプロセスの数をカウントする場合に便利です。
  • ファイル操作
    backupFile 関数を使って、ファイルのバックアップを作成することができます。例えば、重要な設定ファイルをバックアップする際に役立ちます。

共通関数定義クラスを導入するメリット

共通関数定義クラスを導入することで、以下のようなメリットがあります。

  • コードの再利用性が向上
    同じ処理を複数のスクリプトで繰り返し記述する必要がなくなり、コードの再利用性が高まります。例えば、ファイル操作やプロセス管理などの汎用的な処理を共通化できます。
  • 保守性が向上
    処理を一元管理することができるため、スクリプトが増えてもメンテナンスが容易になります。もし変更が必要になった場合、utils.shrc を更新するだけで、全スクリプトに反映されます。
  • コードの可読性が向上
    共通関数を使うことで、各スクリプトがシンプルになり、他の開発者がコードを理解しやすくなります。また、汎用関数の利用によって、スクリプトのロジックが明確に分かりやすくなります。
  • エラーハンドリングの標準化
    エラーハンドリングを一元管理できるため、異常が発生した場合に適切な対応を統一的に行えます。utils.shrc では、エラー時にログを記録する機能を提供しており、異常を簡単にトラッキングできます。

トラブルシューティングとFAQ

共通関数定義クラス(utils.shrc)を利用する中で発生する可能性があるエラーとその対処方法、また、utils.shrc の拡張方法について説明します。

よくあるエラーと対処方法

  • エラー: "Command not found"
    原因: utils.shrc 内で使用しているコマンドがシステムにインストールされていない。
    対処法: 必要なツール(psgrepwc など)がインストールされているかを確認し、インストールしてください。
    RHEL系の場合:

    sudo yum install procps

    または、`dnf` を使用する場合(RHEL 8 以降):

    sudo dnf install procps

  • エラー: "Permission denied"
    原因: スクリプトを実行する権限が不足している。
    対処法: スクリプトに実行権限を付与します。

    chmod +x /path/to/your/script.sh

  • エラー: "No such file or directory"
    原因: 指定されたファイルやディレクトリが存在しない。
    対処法: ファイルパスが正しいかを再確認し、存在することを確認してください。
  • エラー: ロックファイルが削除されていない
    原因: 他のプロセスがロックを保持したまま終了した場合。
    対処法: 手動でロックファイルを削除するか、スクリプトを修正して適切にロック解除を行うようにします。

共通関数定義クラスの拡張方法

utils.shrc は汎用的な関数を定義していますが、必要に応じて独自の関数を追加することも可能です。以下の手順で拡張できます。

  1. 新しい関数を追加する
    utils.shrc に新しい関数を追加することで、特定の用途に合わせた機能を追加できます。

    # 新しい関数の例
    myFunction() {
      echo "This is my custom function"
    }

  2. 関数をグローバルで使用できるようにする
    関数を追加した後、source コマンドで utils.shrc を読み込むことで、すべてのシェルスクリプトでその関数を使用できるようにします。

    source /path/to/your/project/scripts/com/utils.shrc

  3. エラーハンドリングを追加する
    自作の関数にもエラーハンドリングを追加することで、予期しない問題が発生した際にも適切に対応できるようになります。

    myFunction() {
      if [ ! -f "$1" ]; then
        echo "Error: File not found!"
        exit 1
      fi # 関数の処理
    }

  4. 既存の関数をカスタマイズする
    utils.shrc にすでに存在する関数を変更して、自分のプロジェクトに合わせた動作をさせることもできます。ただし、他のスクリプトとの互換性を保つために慎重に変更を加えることが重要です。

よく読まれている記事

1

Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロンプト画面を開いているとき、常にShellは起動している状態です。 「Shell」とは ...

2

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

3

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

4

Shellスクリプト基礎知識(全13記事+2) ├─【Shellの基礎知識】Shellスクリプト入門|初心者が押さえる基本├─【Shellの基礎知識】変数と特殊変数の使い方|初心者向け解説├─【She ...

-Shell-Tips