Я пытаюсь узнать, существует ли команда, которая позволяет называть другой сценарий и рассматривать эти вызовы в порядке FIFO.
НАПРИМЕР: напишите сценарий работ в бесконечном цикле. В этом цикле 10 последовательных запросов выполнены для выполнения сценария B. Однако сценарий B может только быть выполнен, когда его предыдущий запрос был закончен. Сценарий A должен продолжить работать, в то время как 10 требуемых сценариев B последовательно выполняются.
Что я использую в сценарии, чтобы препятствовать тому, чтобы он был выполнен, дважды файл состояния, но можно легко адаптировать ту же самую систему для разрешения сценариев, выполняемых в режиме 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
... и выполняет их в правильном порядке...
Возможно, я неправильно понимаю, но не можете Вы просто поместить вызовы 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
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