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



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.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。无论哪种方式,只要您没有将任何jobsvanilla or chocolate作为后台,那么脚本/作业的执行将是顺序的。在vanilla or chocolate 复合命令中创建所有作业也是确保顺序执行的另一种方法。为了确保所有命令都显式地顺序执行,并以成功完成前面的命令为条件,您可以在包装器中以复合命令的形式调用execute_vanilla.shexecute_chocolate.sh:

execute_vanilla.sh && execute_chocolate.sh

没有将execute_vanilla.shexecute_chocolate.sh设置为复合命令,您的包装器脚本看起来很好。

相关内容

  • 没有找到相关文章

最新更新