我有一堆应同时运行的作业。
每个工作都有其后继工作。
工作后应该逐一进行。
只有在工作结束后才可以开始工作。
第一个完成的工作应立即调用其后工作。
所有其他完成的工作应将其后继工作排入队列。
我正试图将任务后台处理程序(tsp)放在工作后队列中。 但是,我不知道该如何完成工作。
#!/bin/bash
# Starting jobs and collecting their pids
job1 & job1_pid=$! &
job2 & job2_pid=$1 &
job3 & job3_pid=$1
# Catching if jobs are finished and put the afterjobs in queue
{wait $job1_pid && tsp afterjob1} &
{wait $job2_pid && tsp afterjob2} &
{wait $job3_pid && tsp afterjob3}
答案 0 :(得分:0)
一种简单的方法是在 job 执行后立即链接 afterjob 的排队:
job1 && tsp afterjob1 &
job2 && tsp afterjob2 &
job3 && tsp afterjob3 &
这将只执行其相应作业已成功执行的后作业(将0值返回到环境)。如果您希望后续工作始终执行,则应该使用(感谢MatthewStory的建议):
{ job1; tsp afterjob1 } &
{ job2; tsp afterjob2 } &
{ job3; tsp afterjob3 } &
答案 1 :(得分:0)
使用flock
同步后续作业。
完整示例:
#! /bin/bash
case "$1" in
job1) echo job1; exit;;
job2) echo job2; exit;;
job3) echo job3; exit;;
afterjob1) sleep 1; echo afterjob1; exit;;
afterjob2) sleep 1; echo afterjob2; exit;;
afterjob3) sleep 1; echo afterjob3; exit;;
esac
touch /tmp/afterqueue
{ "$0" job1; flock /tmp/afterqueue "$0" afterjob1; } &
{ "$0" job2; flock /tmp/afterqueue "$0" afterjob2; } &
{ "$0" job3; flock /tmp/afterqueue "$0" afterjob3; } &
wait
rm /tmp/afterqueue
答案 2 :(得分:0)
#! /bin/bash
case "$1" in
job1) echo job1; exit;;
job2) echo job2; exit;;
job3) echo job3; exit;;
afterjob1) sleep 1; echo afterjob1; exit;;
afterjob2) sleep 1; echo afterjob2; exit;;
afterjob3) sleep 1; echo afterjob3; exit;;
esac
{ "$0" job1; sem --id afterqueue "$0" afterjob1; } &
{ "$0" job2; sem --id afterqueue "$0" afterjob2; } &
{ "$0" job3; sem --id afterqueue "$0" afterjob3; } &
sem --id afterqueue --wait
但是在使用任何parallel
命令之前,请注意传递引用仪式:
parallel --citation