第一种:
#!/bin/bash
set -ex
function work()
{
echo work $1 starting...
sleep 2
echo work $1 done
}
function parallel_init()
{
maxpro=$1
tmpfifo=/tmp/$$.fifo
[[ -e ${tmpfifo} ]] && rm -rf ${tmpfifo}
mkfifo ${tmpfifo}
exec 16<>${tmpfifo}
rm -rf ${tmpfifo}
for i in $(seq 1 ${max_process})
do
printf %s 000
done >&16
}
max_process=4
parallel_init $max_process
pids=()
for i in {1..4}
do
read -u 16 -n 3 x && ((0==x)) || exit $x
(
work $i;
printf "%.3d" $? >&16
) &
pids+=($!);
done
wait ${pids[@]}
第二种:
#!/bin/bash
set -e
function work()
{
echo work $1 starting...
sleep 2
echo work $1 done
}
export -f work
max_process=2
seq 1 4 | xargs -n 1 -I {} -P ${max_process} bash -c "work {}"
参考:
https://gist.github.com/mjambon/79adfc5cf6b11252e78b75df50793f24
https://gist.github.com/Enteee/c8c11d46a95568be4d331ba58a702b62
https://newbedev.com/parallelize-a-bash-for-loop
https://blog.51cto.com/vaedit/2519334
https://github.com/BG2BKK/githubio/blob/master/content/post/shell%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AE%9E%E8%B7%B5.md