#!/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
【関連する記事】

