如何控制shell包装器中脚本调用的时间

时间:2014-08-22 20:06:11

标签: shell benchmarking

操作系统: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;

谢谢, 麦克

2 个答案:

答案 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.shexecute_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.shexecute_chocolate.sh作为复合命令调用:

execute_vanilla.sh && execute_chocolate.sh

如果没有使execute_vanilla.shexecute_chocolate.sh复合命令,您的包装脚本看起来很好。希望有所帮助。