2016年02月13日

シェルスクリプト(dash|bash)でマルチプロセスの処理


#!/bin/dash
set -u
set -e

fun_main() {
# ジョブ一覧ファイル
# 優先度順に並べておく
local jobs_file=jobs.txt
: > ${jobs_file}

local i
for i in $(seq 10); do
echo job_${i} >> ${jobs_file}
done

# 行番号ファイル
# 1で初期化
local num_file=num.txt
echo 1 > ${num_file}

# ジョブの件数
local jobs_count=$(wc -l < ${jobs_file})

# 4つのプロセスで処理
local id
for id in $(seq 4); do
# 別のプロセスで処理
while :; do
# 行番号
local num

# ファイルディスクリプタとロックファイルを
# むぎゅっと紐付け
{
# ここからブロックを抜けるまでロック
flock -x 3

# 行番号を読み込んで
# インクリメントして書き込み
num=$(tail -n 1 ${num_file})
echo $((num + 1)) >> ${num_file}
} 3>> ${num_file}.lock

# 行番号がジョブの件数を超えたらおしまい
if [ ${num} -gt ${jobs_count} ]; then
break
fi

# 行番号を指定してジョブを取得
local job=$(head -n ${num} < ${jobs_file} | tail -n 1)

# ジョブを実行
echo "${id} -> ${job}"
done &
done

# すべてのプロセスが終了するのを待機
wait
}

fun_main
posted by moritora at 17:29| Comment(0) | シェルスクリプト | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は90日以上新しい記事の投稿がないブログに表示されております。