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版权协议,转载请附上原文出处链接和本声明。