FIFO управляет в сценарии удара

Я пытаюсь узнать, существует ли команда, которая позволяет называть другой сценарий и рассматривать эти вызовы в порядке FIFO.

НАПРИМЕР: напишите сценарий работ в бесконечном цикле. В этом цикле 10 последовательных запросов выполнены для выполнения сценария B. Однако сценарий B может только быть выполнен, когда его предыдущий запрос был закончен. Сценарий A должен продолжить работать, в то время как 10 требуемых сценариев B последовательно выполняются.

1
задан 13 July 2018 в 10:37

3 ответа

Что я использую в сценарии, чтобы препятствовать тому, чтобы он был выполнен, дважды файл состояния, но можно легко адаптировать ту же самую систему для разрешения сценариев, выполняемых в режиме FIFO:

, Например, в ниже примера, сценарий просто выйдет, если он будет уже работать:

#!/bin/bash 

if [ -f /var/tmp/backup.bsy ]; then 
    # backup already running, log and exit
    exit; 
fi

# Set backup status to "Busy"
mv /var/tmp/backup.ok /var/tmp/backup.bsy

# perform backup here

# Set backup status to "Done"
mv /var/tmp/backup.bsy /var/tmp/backup.ok

и это тривиально для изменения exit на цикл, что sleep с несколько секунд/минуты (в зависимости от требований использования) и смотрят, существует ли script.1, script.2, script.3, script.4... и выполняет их в правильном порядке...

;-)

1
ответ дан 3 December 2019 в 06:38

Возможно, я неправильно понимаю, но не можете Вы просто поместить вызовы scriptB в оперативной группе штаба (или подоболочка), и фон , что так, чтобы группа была выполнена асинхронно, например,

#!/bin/bash

echo "Submiting B command group at: $(date)"

{
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
  ./scriptB
} &

echo "Continuing to work at: $(date)"

exit

, где ради иллюстрации, scriptB всего

#!/bin/bash

echo "Starting B at: $(date)"
sleep $((RANDOM/8192))

затем

$ ./scriptA
Submiting B command group at: Mon Oct 17 19:50:07 EDT 2016
Continuing to work at: Mon Oct 17 19:50:07 EDT 2016
user@host$ Starting B at: Mon Oct 17 19:50:07 EDT 2016
Starting B at: Mon Oct 17 19:50:10 EDT 2016
Starting B at: Mon Oct 17 19:50:11 EDT 2016
Starting B at: Mon Oct 17 19:50:12 EDT 2016
Starting B at: Mon Oct 17 19:50:13 EDT 2016
Starting B at: Mon Oct 17 19:50:15 EDT 2016
Starting B at: Mon Oct 17 19:50:15 EDT 2016
Starting B at: Mon Oct 17 19:50:18 EDT 2016
Starting B at: Mon Oct 17 19:50:18 EDT 2016
Starting B at: Mon Oct 17 19:50:18 EDT 2016
1
ответ дан 3 December 2019 в 06:38

wait встроенный из оболочки разработан, чтобы решить точно эту цель, ожидать некоторого процесса (или процессов) для окончания, и собраться это - статус выхода.

Вы можете:

  • Выполненный script_A в бесконечном цикле или exit если это порождает и заканчивает выполнять 10 экземпляров script_B

  • С script_A, используйте конструкцию цикличного выполнения, в цикле, отправьте script_B к фону получите его использование PID $!

  • Ожидайте процесса для окончания wait PID

  • Сделайте это 10 раз

  • Выход от script_A, или продолжите что-то еще

Таким образом, можно сделать script_A как:

#!/bin/bash
for ((i=1; i<=10; i++)); do
    echo "Run $i :: script_B"
    /path/to/script_B &
    pid=$!
    wait "$pid"
done

Если Вы хотите продолжить делать что-то еще, добавьте их после for создать.

Только ради полноты, если Вы хотите продолжить/вспыхнуть на основе статуса выхода последнего scrip_B, добавьте короткую проверку на статус выхода также:

#!/bin/bash                                                                  
for ((i=1; i<=10; i++)); do
    echo "Run $i :: script_B"
    /path/to/script_B &
    pid=$!
    wait "$pid" && continue
    break
done
3
ответ дан 3 December 2019 в 06:38

Другие вопросы по тегам:

Похожие вопросы: