bash入門:シェル内でfunctionを並列実行させる

スポンサーリンク
bash入門:シェル内でfunctionを並列実行させる ノウハウ
bash入門:シェル内でfunctionを並列実行させる
この記事は約5分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、シェル内でfunctionを並列実行させる方法についてご紹介します。

スポンサーリンク

背景

シェル内でfunctionを並列実行させる機会があったので、そのときの内容を備忘として残しました。

この記事のソースは下記のサイトにアップしています。

実行環境について

実行環境は下記の記事を参考にお願いします。

作成ファイル一覧

下記のファイルを作成しました。

        new file:  local/work/02_multi_run/02_multi_run.sh

02_multi_run.sh

#!/bin/bash

function load_out_dir()
{
    run_time=$(TZ=JST-9 date "+%Y%m%d_%H%M%S")

    yyyy=${run_time:0:4}
    mm=${run_time:4:2}
    dd=${run_time:6:2}
    HH=${run_time:9:2}
    MM=${run_time:11:2}
    SS=${run_time:13:2}

    run_name=$(basename "$0")
    run_name=${run_name%.*}

    out_dir=${run_name}/${yyyy}/${mm}/${dd}/${HH}/${MM}/${SS}
    echo "out : ${out_dir}"

    mkdir -p "${out_dir}"

    log=${out_dir}/out.log
}

proc_test()
{
    sleep_time=$(( $RANDOM % 10 ))
    sleep $sleep_time
    echo "[$(TZ=JST-9 date "+%Y/%m/%d %H:%M:%S.%3N")] proc $i ${sleep_time}[s]" | tee -a "${log}"
}

load_out_dir

for i in $(seq 1 10); do
  proc_test $i &
done

wait

動作確認

下記のコマンドを実行します。

make build

make up

make login

cd 02_multi_run

bash 02_multi_run.sh

下記の結果が出力されていれば成功です。

root@ecf916c9c345:/work/02_multi_run# bash 02_multi_run.sh 
out : 02_multi_run/2023/12/03/19/15/25
[2023/12/03 19:15:25.562] proc 9 0[s]
[2023/12/03 19:15:26.568] proc 8 1[s]
[2023/12/03 19:15:27.562] proc 7 2[s]
[2023/12/03 19:15:27.562] proc 5 2[s]
[2023/12/03 19:15:28.561] proc 4 3[s]
[2023/12/03 19:15:30.565] proc 10 5[s]
[2023/12/03 19:15:32.568] proc 2 7[s]
[2023/12/03 19:15:32.571] proc 3 7[s]
[2023/12/03 19:15:32.571] proc 1 7[s]
[2023/12/03 19:15:33.562] proc 6 8[s]

解説

02_multi_run.sh

このBashスクリプトは、以下の機能を持っています:

  1. load_out_dir 関数: スクリプトを実行した時点の日時に基づいてディレクトリを作成し、そのディレクトリのパスやログファイルのパスを変数に設定します。
  2. proc_test 関数: ランダムなスリープ時間(0から9秒のランダムな値)を生成し、その後に「proc」の情報とランダムなスリープ時間を含むログメッセージを生成し、標準出力に表示し、同時に ${log} ファイルに追記します。
  3. load_out_dir 関数を呼び出して、ディレクトリ構造を作成し、ログファイルのパスを設定します。
  4. for ループ: 1から10までの数字に対して proc_test 関数を非同期に実行します。各処理は & を使ってバックグラウンドで実行されます。
  5. wait コマンド: バックグラウンドで実行されたプロセスが終了するまで待機します。

要するに、このスクリプトは以下のことを行います:

  • スクリプトを実行した時点の日時に基づいてディレクトリを作成し、ログファイルのパスを設定します。
  • 1から10までの数字に対して、それぞれランダムなスリープ時間で proc_test 関数を非同期に実行します。
  • 各プロセスはログに自身の情報とランダムなスリープ時間を記録します。
  • すべてのプロセスの終了を待機します。

おわりに

今日は、シェル内でfunctionを並列実行させる方法についてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました