全部博文(298)
分类: Python/Ruby
2012-04-19 17:19:53
shell并发控制脚本
整理自:
该脚本通过建立FIFO(命名管道),建立起进程之间的通讯,并且通过FIFO实现命令的队列化(先进先出),主进程不断地让要执行的命令在后台执行,并且通过控制并发数量,实现在后台运行的命令的个数。
(1) FIFO使命令队列化,并且控制并发数量;
(2) 后台执行命令,父进程使用wait等待全部子进程结束;
(3) 获取失败信息,日志;
(4) 捕获信号,进行信号处理;
ptest.sh
1. #!/usr/bin/bash
2. # SCRIPT: ptest.sh
3. # AUTHOR: Ray001
4. # DATE: 2008/10/03
5. # REV: 2.0
6. # For STUDY
7. #
8. # PURPOSE:
9. # 实现进程并发,提高执行效率,同时能记录每个执行失败的子进程信息
10.
11.
12. #定义并发进程数量
13. PARALLEL=3
14. #定义临时管道文件名
15. TMPFILE=$$.fifo
16. #定义导出配置文件全路径名 该脚本存放的是sleep的时间
17. CMD_CFG=$HOME/cfg/ptest.cfg
18. #定义失败标识文件
19. FAILURE_FLAG=failure.log
20.
21.
22. ####################### 函数定义 ########################
23. # 中断时kill子进程
24. function trap_exit
25. {
26. kill -9 0
27. }
28.
29.
30. # 通用执行函数
31. exec_cmd()
32. {
33. # 此处为实际需要执行的命令,本例中用sleep做示例
34. sleep ${1}
35. if [ $? -ne 0 ]
36. then
37. echo "命令执行失败"
38. return 1
39. fi
40. }
41.
42.
43. trap 'trap_exit; exit 2' 1 2 3 15
44.
45. #清理失败标识文件
46. rm -f ${FAILURE_FLAG}
47.
48. #为并发进程创建相应个数的占位
49. mkfifo $TMPFILE #创建FIFO
50. exec 4<>$TMPFILE
51. rm -f $TMPFILE #为啥要删除??
52. { #向FIFO写入$PARALLEL个数的换行
53. count=$PARALLEL
54. while [ $count -gt 0 ]
55. do
56. echo
57. let count=$count-1
58. done
59. } >&4
60.
61. #从任务列表 seq 中按次序获取每一个任务
62. while read SEC
63. do
64. read <&4
65. ( exec_cmd ${SEC} || echo ${SEC}>>${FAILURE_FLAG} ; echo >&4 ) &
66. done<$CMD_CFG
67. wait
68. exec 4>&-
69.
70. #并发进程结束后判断是否全部成功
71. if [ -f ${FAILURE_FLAG} ]
72. then
73. exit 1
74. else
75. exit 0
76. fi
ptest.cfg
1. 10
2. 20
3. 30
4. 6
5. 18
6. 35
7. 23