shell多线程编程

目前,我要对一个hive表进行处理,主要是对每一个day分区的数据进行处理,我写了一个shell脚本循环的调用对分区数据进行筛选

代码很简单:

n=1
while [ $n != 600 ]
do
    date=`date --date="$n days age" +'%Y%m%d'`
    ......
let n=n+1
done

但是,我跑一年的数据需要好久,后来我想数据之间又没有什么关系,我应该启个多线程去执行啊,本着学习的态度搜索了下,发现了其实在后面加入&就可以放在后台中执行,

我们不能启线程太多,需要进行一定控制。

tmp_fifofile="/tmp/$$.fifo"
mkfifo $tmp_fifofile
exec 6<>$tmp_fifofile
rm tmp_fifofile

说实话,这一段代码我是真心看不懂。。。好吧继续查。

第一句很好理解,创建一个变量存储的一个Path(临时文件,$$标示当前的进程id)

    • $0 这个程式的执行名字
    • $n 这个程式的第n个参数值,n=1..9
    • $* 这个程式的所有参数,此选项参数可超过9个。
    • $# 这个程式的参数个数
    • $$ 这个程式的PID(脚本运行的当前进程ID号)
    • $! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
    • $? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
    • $- 显示shell使用的当前选项,与set命令功能相同
    • $@ 跟$*类似,但是可以当作数组用

ok

第二句我mkfifo是什么鬼,原谅我只看到过mkdir

............经过漫长的查询,貌似这个小白问题关注的人也少。。。原来这个被称为有名管道,也就是管道可以是我们通常用的|的无名管道,也可以是mkfifo filename有名管道。

管道文件,主要利用它读取数据时,一旦没有数据就会停滞下来。可是,他是怎么区分一次一次数据的呢?目测是回车?

exec主要就是文件操作符了,这个我也不是很懂,记得那时候被问过,0,1,2对应。(0-stdin,1-stdout,2-stderr)

exec 6<> >代表读的操作,<代表写的操作。

> 标示的是将重定向到文件,>&标示的是到一个文件操作符中。 >&-则表示关闭这个文件操作符。

那么显而易见read -u就是标示从文件标示符读取了。

补充:fd (file descriptor,文件描述符)

/proc/self/fd/

那么代码就很好理解了,管道里面塞进去15个换行符,管道都是一行一行读取的。

thread=15
for((i=0;i<$thread;i++));do
echo
done >&6

启一个你要跑的任务数量,read一下,完成了echo进去一个回车。如果线程满了,下一个任务就read 挂住。

{}&,就是将命令扔到后台。

最后最好来一句wait,要不最后的输出有点乱。

for((i=1;i<60;i++));do
read -u6
{
date=`date --date="$i days ago" +'%Y%m%d'`
echo date
echo >&6
}&
done
wait
exec 6>&-
exec 6>&-
exit 0

 

posted @ 2016-03-25 19:48  dalu610  阅读(1504)  评论(0编辑  收藏  举报