shell脚本实现多线程

shell脚本实现多线程

在服务器上执行find查找命令时候,由于查找目录较大,可能耗时较长。基于最近的工作,记录一下使用shell脚本实现在当前目录下的子目录并发查找,并将结果回收的功能。

主脚本 main.sh 实现分发查找功能,在for循环中使用&即可将线程置于后台执行,注意使用wait关键字等待所有线程执行完成才执行后续操作。脚本调用方式(cd 到当前目录):main.sh findScript.sh result.txt .
最终会生成结果result.txt,保存在当前目录下

// main.sh
#!/bin/bash
#需要传入两个参数,第一个为需要执行的脚本名scrip.sh,第二个为扫描保存结果文件名result.txt
for file in *
do
{
   if [ -d $file ]; then
      cp $1 $file     #将脚本复制到子目录下
      cd $file/
      sh $1
   fi
}&
done
wait      #等待所有进程执行完成

[ -e "$2" ] ||touch $2     #创建结果保存文件
chmod 777 $2               #权限可以不用给777,但是要有写入权限
find -name "$2"|xargs cat > $2     #回收结果,指定文件名的查找时间很短,使用cat命令进行合并,也可以按照子目录循环获取
for file in *
do
{
    if [ -d $file ];then
       rm $file/$1        #每个子目录下都有当前目录的查找脚本和结果,需要删除
       rm $file/$2
    fi
}
done

echo "Done"

查找脚本 findScript.sh,实现按照关键字查找,并将结果保存在result.txt中。

// findScript.sh
#!/bin/bash
[ -e "result.txt" ] && rm -rf result.txt
find -name "*.*" | xargs grep -E "html" #在所有文件中查找含有关键字html的结果

这是最简单是多线程实现方式,当然在这个例子中也可能存在一个问题:如果子目录中有一个很大,其他的很小,那么这个分发操作也是没有太大意义的。当然,多线程可以有更加灵活的实现方式,这算是抛砖引玉吧!

注:转载请注明出处。


版权声明:本文为wqu9527原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。