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,如需转载请自行联系原作者
目录
相关文章
|
3天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
28 3
|
19小时前
|
运维 Shell Python
Shell和Python学习教程总结
Shell和Python学习教程总结
|
22小时前
|
监控 Shell 应用服务中间件
第十二章 Shell脚本编写及常见面试题(二)
第十二章 Shell脚本编写及常见面试题(二)
|
22小时前
|
监控 关系型数据库 Shell
第十二章 Shell脚本编写及常见面试题(一)
第十二章 Shell脚本编写及常见面试题(一)
|
1天前
|
监控 Shell
生产环境Shell脚本Ping监控主机是否存活(多种方法)
生产环境Shell脚本Ping监控主机是否存活(多种方法)
|
1天前
|
运维 Shell
Shell脚本判断IP是否合法性(多种方法)
Shell脚本判断IP是否合法性(多种方法)
|
7天前
|
运维 监控 Shell
利用Shell脚本编写局域网监控软件:实时监测主机连接情况
本文介绍了如何使用Shell脚本创建一个局域网监控工具,以实时检查主机连接状态。脚本包括扫描IP地址范围检测主机可达性及使用`netstat`监控ESTABLISHED连接。此外,还展示了如何每60秒将连接数数据自动提交到指定网站API,以便实时跟踪网络活动。这个自动化监控系统有助于提升网络安全性和故障排查效率。
30 0
|
8天前
|
Shell
Shell脚本之流程控制语句
Shell脚本之流程控制语句
|
9天前
|
JSON 运维 监控
训练shell常用脚本练习(三)
【4月更文挑战第14天】shell代码训练(三)
30 1
|
13天前
|
存储 弹性计算 Shell
ecs服务器shell常用脚本练习(十)
【4月更文挑战第11天】shell代码训练(十)
143 0