よっしー
こんにちは。よっしーです(^^)
今日は、シェル内で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スクリプトは、以下の機能を持っています:
load_out_dir
関数: スクリプトを実行した時点の日時に基づいてディレクトリを作成し、そのディレクトリのパスやログファイルのパスを変数に設定します。proc_test
関数: ランダムなスリープ時間(0から9秒のランダムな値)を生成し、その後に「proc」の情報とランダムなスリープ時間を含むログメッセージを生成し、標準出力に表示し、同時に${log}
ファイルに追記します。load_out_dir
関数を呼び出して、ディレクトリ構造を作成し、ログファイルのパスを設定します。for
ループ: 1から10までの数字に対してproc_test
関数を非同期に実行します。各処理は&
を使ってバックグラウンドで実行されます。wait
コマンド: バックグラウンドで実行されたプロセスが終了するまで待機します。
要するに、このスクリプトは以下のことを行います:
- スクリプトを実行した時点の日時に基づいてディレクトリを作成し、ログファイルのパスを設定します。
- 1から10までの数字に対して、それぞれランダムなスリープ時間で
proc_test
関数を非同期に実行します。 - 各プロセスはログに自身の情報とランダムなスリープ時間を記録します。
- すべてのプロセスの終了を待機します。
おわりに
今日は、シェル内でfunctionを並列実行させる方法についてご紹介しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント