コマンドや 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