之前在用脚本去分析大的日志文件的时候,因为文件有几十G之大,记录数达到上千万量级甚至更多时,单进程的脚本去分析,效率非常低下,耗时也会相当久,因此这时候就需要用到shell的多进程机制,以加快分析进度。
多进程方式主要分为以下3种方式
1)代码段后台执行方式
例子从网上摘抄:
#!/bin/bash
for ((i=0;i<5;i++));do
{
sleep 3;echo 1》aa && echo ”done!”
} &
done
wait
cat aa|wc -l
rm aa
for ((i=0;i<5;i++));do
{
sleep 3;echo 1》aa && echo ”done!”
} &
done
wait
cat aa|wc -l
rm aa
wait是等待前面的后台任务全部完成才往下执行,否则程序本身是不会等待的。还可以只wait subprocessid 只等待某一个子进程结束。
2)精确控制最多并发进程数目的多进程
mutil_proc(){
...需要进行多进程操作的步骤
}
tmp_fifofile=”/tmp/$.fifo”
mkfifo $tmp_fifofile # 新建一个fifo类型的文件
exec 6<>$tmp_fifofile # 将fd6指向fifo类型
rm $tmp_fifofile
thread=15 # 此处定义线程数
for ((i=0;i<$thread;i++));do
echo
done >&6 # 事实上就是在fd6中放置了$thread个回车符
for ((i=0;i<50;i++));do # 50次循环,可以理解为总的需要执行次数
read -u6
mkfifo $tmp_fifofile # 新建一个fifo类型的文件
exec 6<>$tmp_fifofile # 将fd6指向fifo类型
rm $tmp_fifofile
thread=15 # 此处定义线程数
for ((i=0;i<$thread;i++));do
echo
done >&6 # 事实上就是在fd6中放置了$thread个回车符
for ((i=0;i<50;i++));do # 50次循环,可以理解为总的需要执行次数
read -u6
# 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
{ # 此处子进程开始执行,被放到后台
mutil_proc && { # 此处可以用来判断子进程的逻辑
echo ” mutil_proc is finished”
} || {
echo ” mutil_proc error”
}
echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
} & #后台执行实现多进程
done
wait # 等待所有的后台子进程结束
exec 6>&- # 关闭df6
exit 0
mutil_proc && { # 此处可以用来判断子进程的逻辑
echo ” mutil_proc is finished”
} || {
echo ” mutil_proc error”
}
echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
} & #后台执行实现多进程
done
wait # 等待所有的后台子进程结束
exec 6>&- # 关闭df6
exit 0
3)主要是为了简单,而通过切割文件,然后后台执行的方式实现多进程(自创)
例如:
1. 先指定行数进行分割文件
split -l ${splits3} -d ${MAIN_PATH}doubt.txt_${day} ${MAIN_PATH}split/doubt.txt
2.编写循环对多份分割文件后台执行以实现多进程
function analyse()
{
cd ${MAIN_PATH}split/
for file in `ls doubt.txt*`
do
${MAIN_PATH}pvexecurl.sh $file &
done
wait
}