金子邦彦研究室データ処理SQL, リレーショナルデータベースの活用コマンドや bash 内の関数を並列実行(bash を使用)

コマンドや bash 内の関数を並列実行(bash を使用)

概要:コマンドや bash 内の関数を並列実行するための 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

[image]