コマンドや bash 内の関数を並列実行(bash を使用)
概要:コマンドや bash 内の関数を並列実行するための bash スクリプト
使い方
- TODOLIST は,並列実行させたいコマンド,あるいは「taskほにゃらら <引数>」
- NUM_CONCURRENT は,並列度
- bash ... で実行開始
#!/bin/bash
# concurrent execution of tasks
# さまざまな種類のタスクがあるとする
function task00() {
# 引数:表示の繰り返し回数(1以上の整数)
for i in `seq 1 $1`; do
echo '0'
sleep 1
done
}
function task01() {
# 引数:表示の繰り返し回数(1以上の整数)
for i in `seq 1 $1`; do
echo '1'
sleep 1
done
}
function task02() {
# 引数:表示の繰り返し回数(1以上の整数)
for i in `seq 1 $1`; do
echo '2'
sleep 1
done
}
function task03() {
# 引数:表示の繰り返し回数(1以上の整数)
for i in `seq 1 $1`; do
echo '3'
sleep 1
done
}
function task04() {
# 引数:表示の繰り返し回数(1以上の整数)
for i in `seq 1 $1`; do
echo '4'
sleep 1
done
}
#########################################################################
# キャッシュのクリア(PageCache, dentries and inodes)
function cache_clear() {
sync
sync
sync
sync
sync
sleep 3
sudo sysctl -w vm.drop_caches=3 > /dev/null
echo 3 | sudo tee -a /proc/sys/vm/drop_caches > /dev/null
return
}
# 現在時刻(あとで引き算しやすいように unixtime)
function current_time() {
echo `date +%s.%N`
return
}
#########################################################################
# TODOLIST は,実行させたいコマンド,あるいは「taskほにゃらら <引数>」
TODOLIST=$(cat <<EOD
task01 10
task02 10
task03 10
task04 10
EOD
)
# 並列度
NUM_CONCURRENT=3
#########################################################################
# TODOLIST の記載を,指定された並列度で実行.
# この先は決まり文句
# さて,このプログラムは,引数の数が1のときは,行番号の指定である.TODOLIST のその行番号の1行を実行する.使い方 concurrent.sh <行番号>
if [ $# == 1 ]; then
# echo "$a" のように「"」を付けると改行が保たてる
eval $(echo "$TODOLIST" | sed -n ${1}P)
exit
fi
# 引数なしで実行するとき,
# seq 1 $(echo "$TODOLIST" | wc -l) は,TODOLIST の行数以下の整数を1から順に生成.
# 使うときは chmod 755 で実行可能にしておくこと.
seq 1 $(echo "$TODOLIST" | wc -l) | xargs -L 1 -P ${NUM_CONCURRENT} bash ./$0
