并行运行Shell脚本

时间:2018-03-20 11:10:01

标签: bash shell unix

我创建脚本并将其提供给制作团队。 并且制作团队必须每天运行所有这些脚本。 如果有100个脚本,他们必须为特定日期运行nohup命令100次。

例如

nohup abc.sh 2018-03-01 &
nohup abc1.sh 2018-03-01 &
nohup abc2.sh 2018-03-01 & and so on till the last script.

现在我已经完成了以下Wrapper

echo "*** Start time ---> `date '+%Y-%m-%d %H:%M:%S'` ***" 
for date in `cat datefile_Prepaid_data` 
do 
date1=`echo $date|cut -d"|" -f1`
echo $date1
sh abc.sh $date1
sh abc1.sh $date1
sh abc2.sh $date1 and so on till the last script

return_code=$? 
if [ ${return_code} -eq 0 ] 
then 
echo "\n  Success... for date $date " 
else 
echo "\n   Failed... for date $date .. So exiting." 
exit 1 
fi 
done 

但问题是这个包装器逐个运行脚本。我们是否有另一种方法来实现这一点,脚本也应该并行运行。

我创建了一个单独的文件' datefile_Prepaid_data'具有包装应该运行的日期。

1 个答案:

答案 0 :(得分:1)

嗨如果你从脚本中看到你没有并行运行它们。要并行运行它们,您必须在后台运行每个作业。如下所示: -

sh abc.sh $date1 &
sh abc1.sh $date1 &
sh abc2.sh $date1 & 
#and so on till the last script

但这里的一个问题是它会立即从return_code=$?开始执行脚本。因此,您必须放置wait命令,以便它应该等到上一个作业完成。

 wait
 #now below commend will execute only when all jobs completes.
 #also it will wait till all job completes successfully
 return_code=$? 

现在还有一个问题。您的$?将为您提供上次完成作业的退出状态。如果没有成功运行,则下面的逻辑将被错误地执行。因此,您必须根据当前要求修改以下条件。

 if [ ${return_code} -eq 0 ] 

要知道脚本是否成功执行,只需在每个作业中添加以下脚本: -

在所有abc.sh到abc99.sh

 echo "Job $0 completed with exit status :$? >> job_status.log

现在给你一个完整的答案: -

echo "*** Start time ---> `date '+%Y-%m-%d %H:%M:%S'` ***" 
for date in `cat datefile_Prepaid_data` 
do 
    date1=`echo $date|cut -d"|" -f1`
    echo $date1
    sh abc.sh $date1 &
    sh abc1.sh $date1 &
    sh abc2.sh $date1 &
        #and so on till the last script
done 

在所有abc.sh到abc99.sh

 echo "Job $0 completed with exit status :$? >> job_status.log