shell并发脚本学习

shell并发脚本学习
在CU上看到的老帖子,创建并发程序的shell。个人觉得非常经典,贴回来好好学习使用。用()包围的是我写的学习笔记,#的是原帖注释:
#!/usr/bin/ksh(自然我得把这里改成bash)
# SCRIPT: ptest.sh
# AUTHOR: Ray001(呃,这些也是要学习滴,版权意识嘛~)
# DATE: 2008/10/03
# REV: 2.0
# For STUDY
# PURPOSE:
# 实现进程并发,提高执行效率,同时能记录每个执行失败的子进程信息

#定义并发进程数量
PARALLEL=3 
#定义临时管道文件名(我为这个定义想了好久,不知道$$.是什么特殊变量;后来实际上测试机一实验才发现把事情想复杂了……这就是以“脚本pid+.fifo”组成的字符串而已。完全可以改写成其他样子。
TMPFILE=$$.fifo
#定义导出配置文件全路径名(其实我个人很诧异为什么这里要定义到家目录去,这样在touch ptest.cfg的时候多麻烦呀)
CMD_CFG=$HOME/cfg/ptest.cfg
#定义失败标识文件
FAILURE_FLAG=failure.log

####################### 函数定义 ########################
# 中断时kill子进程(学习重点一:kill -9 0——杀死脚本自己及衍生出来的子进程,嗯,全家自杀)
function trap_exit
{
kill -9 0
}
# 通用执行函数
exec_cmd()
{
    # 此处为实际需要执行的命令,本例中用sleep做示例
        sleep ${1}
    if [ $? -ne 0 ]
    then
        echo "命令执行失败"
        return 1
    fi
}

####################### 主程序 ########################
(学习重点二:当信号为1、2、3、15时,执行''中的命令,即调用trap_exit函数自杀,然后退出该shell并返回信号2——把0、1留给后面用)
trap 'trap_exit; exit 2' 1 2 3 15

#清理失败标识文件
rm -f  ${FAILURE_FLAG}

#为并发进程创建相应个数的占位
(创建命名管道)
mkfifo $TMPFILE
(学习重点三:为命名管道指定文件标识符为4,<>分别是输入和输出,即绑定了该管道的输入输出都在4这个文件标识符上!) 
exec 4<>$TMPFILE
(删除管道文件,不知道这步是为什么,目前只能猜测是担心程序运行时该文件被其他人或者程序误用吧?)
rm -f $TMPFILE 
(用{}和用()的区别在shell是否会衍生子进程。let命令用以变量运算。这一段给文件标识符输入了几个回车。)
(不知道这几个回车和“并发占位”什么关系。找了很久,没发现??)

        count=$PARALLEL
        while [ $count -gt 0 ]
        do 
                echo
                let count=$count-1
        done 
} >&4

#从任务列表 seq 中按次序获取每一个任务
(从家目录下那个cfg文件中读取sleep的时间)
while read SEC 
do
(从标识符中读取回车?不懂,还是管道和子进程的问题……)
        read <&4
(后台执行主程序命令或者输出错误日志,完成后清空标识符)
        (  exec_cmd ${SEC} || echo ${SEC}>>${FAILURE_FLAG} ; echo >&4 ) &
done<$CMD_CFG
(等待子进程结果返回值)
wait 
(关闭文件标识符4)
exec 4>&- 

#并发进程结束后判断是否全部成功
if [ -f ${FAILURE_FLAG} ]
then
        exit 1
else
        exit 0
fi




本文转自 vfast_chenxy 51CTO博客,原文链接:http://blog.51cto.com/chenxy/304620,如需转载请自行联系原作者
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值