Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 并行运行Shell脚本_Bash_Shell_Unix - Fatal编程技术网

Bash 并行运行Shell脚本

Bash 并行运行Shell脚本,bash,shell,unix,Bash,Shell,Unix,我创建脚本并将其交给生产团队。 生产团队每天都要运行所有这些脚本。 假设有100个脚本,它们必须在特定日期运行100次nohup命令 范例 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. 现在我已经完成了以下工作 echo "*** Start time ---> `date '+%Y-%m

我创建脚本并将其交给生产团队。 生产团队每天都要运行所有这些脚本。 假设有100个脚本,它们必须在特定日期运行100次nohup命令

范例

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.
现在我已经完成了以下工作

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\u预付费\u数据”,其中包含包装器应该运行的日期。

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

sh abc.sh $date1 &
sh abc1.sh $date1 &
sh abc2.sh $date1 & 
#and so on till the last script
但这里的一个问题是,它将立即从
return\u 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 "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
 echo "Job $0 completed with exit status :$? >> job_status.log

你看到等待的手册页了吗?您可以执行类似于job1和job2&wait的操作,但您需要单独存储状态变量。显然,您必须在每个脚本调用结束时添加一个与,就像您在命令行中所做的那样。您好,Pierre,如果我在for循环中添加“&”,您的意思是说所有脚本都将并行运行?您好。不,我没有看到手册页。我会检查的。我想知道如何使用“等待”。和每个脚本的“状态变量”。嗨,现在我的同事说我必须为每个脚本添加返回代码。我们有更好的选择吗?好的,如果我添加“等待”,即使任何脚本失败,其余的作业也将运行并完成。是这样吗?
cat datefile`
do
date1=
echo$date | cut-d“|”-f1`
echo$date1
sh abc.sh$date1&
echo“作业$0已完成,退出状态:$?>>Job\u status.log
sh abc1.sh$date1&
echo”作业$0已完成,退出状态:$?>>job_status.log sh abc2.sh$date1&echo“job$0已完成,退出状态:$?>>job_status.log等待返回\u code=$?如果[${return\u code}-eq 0],则echo”\n成功。。。对于日期$date“else echo”\n失败。。。日期$日期。。所以退出。“退出1 fi是否正确?请检查“等待”和“回送作业$0已完成,退出状态:$?>>job_status.logIt将附加。我正在使用
>
这将把所有日志附加到此文件中。完全没有覆盖。