Bash: поймать, если работа закончена - PullRequest
0 голосов
/ 03 июля 2018

У меня есть куча заданий, которые должны запускаться одновременно.

У каждой работы есть своя работа.

Последующие работы должны выполняться один за другим.

Задержка может начаться, только если ее работа завершена.

Первое выполненное задание должно немедленно вызвать его задание.

Все остальные задания по завершении должны поставить свои последующие задания в очередь.

Я пытаюсь поместить пост-задания в очередь с помощью диспетчера задач (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 голосов
/ 04 июля 2018

Используйте 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
0 голосов
/ 04 июля 2018

Команда sem для parallel также может использоваться для синхронизации заданий.

#! /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
0 голосов
/ 03 июля 2018

Простой способ состоит в том, чтобы поставить в очередь очередность afterjob сразу после выполнения задания :

job1 && tsp afterjob1 &
job2 && tsp afterjob2 &
job3 && tsp afterjob3 &

Этот будет выполнять только последующие задания, если их соответствующее задание было успешно выполнено (вернуло значение 0 в окружение). Если вы хотите, чтобы задание всегда выполнялось, вы должны использовать (спасибо MatthewStory за предложение):

{ job1; tsp afterjob1 } &
{ job2; tsp afterjob2 } &
{ job3; tsp afterjob3 } &
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...