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)
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