重击:如果工作完成就赶上

时间:2018-07-03 04:56:03

标签: linux bash shell

我有一堆应同时运行的作业。

每个工作都有其后继工作。

工作后应该逐一进行。

只有在工作结束后才可以开始工作。

第一个完成的工作应立即调用其后工作。

所有其他完成的工作应将其后继工作排入队列。

我正试图将任务后台处理程序(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}

3 个答案:

答案 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)

semparallel命令还可以用于同步作业。

#! /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