Bash中使用指定线程数完成批量任务
2018-09-09 00:00
507 查看
预备知识:
文件描述符:
查看:当前终端的描述符在/dev/fd
或echo $$ 查看当前终端进程号,去/proc/进程号/fd中找
基本用法
exec fd<>file #创建一个文件句柄 ,0,1,2为保留文件句柄不能使用
exec fd>&- or exec -fd<& #关闭文件句柄,从哪个终端创建要在同一个终端关闭
使用指定线程的一个例子:
#!/bin/bash
#
WD=192.168.1.
THREAD=30 #要开启的进程数
TMPFIFO=/root/test/$$.fifo #临时管道文件
mkfifo $TMPFIFO #创建临时管道文件
exec 1000<>$TMPFIFO #创建管道文件管理的文件句柄1000
rm -rf $TMPFIFO #删除临时管道文件
for ((i=1;i<=$THREAD;i++));do
echo
done >&1000 #循环写入回车符到管道,后面借用read命令一次读取一行的特性,来确保每一行只有一个线程占位;
这里让人联想到生产者&消费者模型,管道文件充当消息队列,来记录消费者的需求,然后由生产者
去领任务,并完成任务,这里运用了异步解耦的思想。
for i in `seq 1 255`;do
read -u1000 #从文件描述符管道中,获取一个管道的线程占位然后开始执行操作;read中-u后面跟fd,
表示从文件描述符中读入,该文件描述符可以是exec新开启的。
{
ping -c 1 -w 1 $WD$i &>/dev/null
[ $? == 0 ] && echo "$WD$i is up" || echo "$WD$i is down"
echo "" >&1000 #任务执行完后在fd5中写入一个占位符,以保证这个线程执行完后,线程继续保持占位,
继而维持管道中永远是50个线程数,&表示该部分命令/任务放入后台不占当前的bash,
实现并行处理
}&
done >> result.txt
wait #等待父进程的子进程都执行结束后执行后续操作
echo "Hello,world"
exec 1000>&- #释放文件句柄
exit 0
文件描述符:
查看:当前终端的描述符在/dev/fd
或echo $$ 查看当前终端进程号,去/proc/进程号/fd中找
基本用法
exec fd<>file #创建一个文件句柄 ,0,1,2为保留文件句柄不能使用
exec fd>&- or exec -fd<& #关闭文件句柄,从哪个终端创建要在同一个终端关闭
使用指定线程的一个例子:
#!/bin/bash
#
WD=192.168.1.
THREAD=30 #要开启的进程数
TMPFIFO=/root/test/$$.fifo #临时管道文件
mkfifo $TMPFIFO #创建临时管道文件
exec 1000<>$TMPFIFO #创建管道文件管理的文件句柄1000
rm -rf $TMPFIFO #删除临时管道文件
for ((i=1;i<=$THREAD;i++));do
echo
done >&1000 #循环写入回车符到管道,后面借用read命令一次读取一行的特性,来确保每一行只有一个线程占位;
这里让人联想到生产者&消费者模型,管道文件充当消息队列,来记录消费者的需求,然后由生产者
去领任务,并完成任务,这里运用了异步解耦的思想。
for i in `seq 1 255`;do
read -u1000 #从文件描述符管道中,获取一个管道的线程占位然后开始执行操作;read中-u后面跟fd,
表示从文件描述符中读入,该文件描述符可以是exec新开启的。
{
ping -c 1 -w 1 $WD$i &>/dev/null
[ $? == 0 ] && echo "$WD$i is up" || echo "$WD$i is down"
echo "" >&1000 #任务执行完后在fd5中写入一个占位符,以保证这个线程执行完后,线程继续保持占位,
继而维持管道中永远是50个线程数,&表示该部分命令/任务放入后台不占当前的bash,
实现并行处理
}&
done >> result.txt
wait #等待父进程的子进程都执行结束后执行后续操作
echo "Hello,world"
exec 1000>&- #释放文件句柄
exit 0
相关文章推荐
- 使用 wget 完成批量下载
- 使用CMD模式批量删除指定目录(支持目录中多层文件夹嵌套)下指定格式文件
- JBPM4.4 使用泳道动态指定下一个任务节点任务人的两种方式之方法二
- SQL Server 2005使用作业实现定时备份任务和删除指定天数前的备份文件
- 使用NHibernate完成对数据的批量导入 .
- 使用powershell完成定时get任务
- 基于Java语言完成:使用URL下载指定的文件保存到指定的文件夹中
- 使用DownloadProvider来完成下载任务
- Windows系统使用vbs脚本或bat脚本强制杀死指定所有进程 vbs实现循环持续写入内容到vbs打开开的记事本 使用vbs、bat添加windows计划任务 使用cmd schtasks命令添加windows计划任务
- Django中使用django-celery完成异步任务(1)
- 使用NSRunloop等待异步任务完成
- Django中如何使用django-celery完成异步任务
- Activiti学习入门(5) -- 学习完成指定的任务
- 使用DownloadProvider来完成下载任务
- 使用caffe的HDF5数据完成回归任务
- 使用DownloadProvider来完成下载任务
- Django中如何使用django-celery完成异步任务1(转)
- 使用NSRunloop等待异步任务完成
- 【入门篇】Activiti完成指定流程定义下任务
- 使用NSRunloop等待异步任务完成