操作系统: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;
谢谢, 麦克
答案 0 :(得分:1)
使用此逻辑 - >
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
如果您不想处理每个子任务的pids,请使用以下逻辑。 "工作-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;
答案 1 :(得分:0)
除了原始答案之外,避免异步执行的简单方法是不背景 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
复合命令,您的包装脚本看起来很好。希望有所帮助。