OS: fedora fc14.x86_64:
我想创建一个执行多个脚本的包装器,并且在前一个脚本中的所有作业完成之前,每个后续脚本都不会开始。
在下面的脚本中,'execute_swirl'作业需要在执行之前完成'vanilla'和'chocolate'。
发生的情况是,连续的脚本(例如,下面的脚本'chocolate')在'vanilla'完成之前开始。
# execute all the jobs related to vanilla
execute_vanilla.sh;
execute_vanilla.sh contains:
/usr/local/bin/program/job1 & /usr/local/bin/program/job2 & /usr/local/bin/program/job3;
sleep 60;
# execute all the jobs related to chocolate
execute_chocolate.sh;
execute_chocolate.sh contains:
/usr/local/bin/program/job4 & /usr/local/bin/program/job5 & /usr/local/bin/program/job6;
sleep 60;
# execute all the jobs related to vanilla_chocolate_swirl
execute_swirl.sh;
谢谢,迈克
使用这个逻辑->
execute_vanilla.sh:
/usr/local/bin/program/job1 &
pid_job1=$!
/usr/local/bin/program/job2 &
pid_job2=$!
/usr/local/bin/program/job3 &
pid_job3=$!
wait $pid_job1 $pid_job2 $pid_job3
或者使用下面的逻辑,如果你不想处理每个子任务的pid。"jobs -p"给出处于执行状态的子进程的pid。
/usr/local/bin/program/job1 &
/usr/local/bin/program/job2 &
/usr/local/bin/program/job3 &
.
.
/usr/local/bin/program/job40 &
for job in `jobs -p`
do
wait $job
done
同样,您可以修改巧克力脚本。然后可以在包装器中执行以下操作:.
./execute_vanilla.sh &
pid_vanilla=$!
./execute_chocolate.sh &
pid_chocolate=$!
wait $pid_vanilla $pid_chocolate
# execute all the jobs related to vanilla_chocolate_swirl
./execute_swirl.sh;
如果你想要巧克力脚本等待香草完成,然后简单地做如下。在这种情况下,您不需要在包装器内的后台运行任何脚本,流将是顺序的->
./execute_vanilla.sh
./execute_chocolate.sh
# execute all the jobs related to vanilla_chocolate_swirl
./execute_swirl.sh;
除了原来的答案之外,避免异步执行的简单方法是不要在execute_vanilla.sh
或execute_chocolate.sh
中后台执行任何作业。例如,修改脚本以包含:
execute_vanilla.sh contains:
/usr/local/bin/program/job1
/usr/local/bin/program/job2
/usr/local/bin/program/job3
为了使execute_vanilla.sh
中的每个任务都成功完成,在执行下一个命令之前,可以对execute_vanilla.sh
进行如下修改:
execute_vanilla.sh contains:
/usr/local/bin/program/job1 &&
/usr/local/bin/program/job2 &&
/usr/local/bin/program/job3
同样适用于execute_chocolate.sh
。无论哪种方式,只要您没有将任何jobs
或vanilla or chocolate
作为后台,那么脚本/作业的执行将是顺序的。在vanilla or chocolate
复合命令中创建所有作业也是确保顺序执行的另一种方法。为了确保所有命令都显式地顺序执行,并以成功完成前面的命令为条件,您可以在包装器中以复合命令的形式调用execute_vanilla.sh
和execute_chocolate.sh
:
execute_vanilla.sh && execute_chocolate.sh
没有将execute_vanilla.sh
和execute_chocolate.sh
设置为复合命令,您的包装器脚本看起来很好。