#!/usr/bin/ksh
# SCRIPT: ptest.sh
# AUTHOR: Ray001
# DATE: 2008/10/03
# REV: 2.0
# For STUDY
#
# PURPOSE:
# 實現進程併發,提高執行效率,同時能記錄每個執行失敗的子進程信息
#定義併發進程數量
PARALLEL=3
#定義臨時管道文件名
TMPFILE=$.fifo
#定義導出配置文件全路徑名
CMD_CFG=$HOME/cfg/ptest.cfg
#定義失敗標識文件
FAILURE_FLAG=failure.log
####################### 函數定義 ########################
# 中斷時kill子進程
function trap_exit
{
kill -9 0
}
# 通用執行函數
exec_cmd()
{
# 此處爲實際需要執行的命令,本例中用sleep做示例
sleep ${1}
if [ $? -ne 0 ]
then
echo "命令執行失敗"
return 1
fi
}
trap 'trap_exit; exit 2' 1 2 3 15
#清理失敗標識文件
rm -f ${FAILURE_FLAG}
#爲併發進程創建相應個數的佔位
mkfifo $TMPFILE
exec 4<>$TMPFILE
rm -f $TMPFILE
{
count=$PARALLEL
while [ $count -gt 0 ]
do
echo
let count=$count-1
done
} >&4
#從任務列表 seq 中按次序獲取每一個任務
while read SEC
do
read <&4
( exec_cmd ${SEC} || echo ${SEC}>>${FAILURE_FLAG} ; echo >&4 ) &
done<$CMD_CFG
wait
exec 4>&-
#併發進程結束後判斷是否全部成功
if [ -f ${FAILURE_FLAG} ]
then
exit 1
else
exit 0
fi