Это запускает оба процесса, ждет первого, который завершает, а затем убивает другой:
#!/bin/bash
{ cd ./frontend && gulp serve; } &
{ cd ./backend && gulp serve --verbose; } &
wait -n
pkill -P $$
Как это устроено
Начало:
{ cd ./frontend && gulp serve; } &
{ cd ./backend && gulp serve --verbose; } &
Две вышеупомянутые команды запускают оба процесса в фоновом режиме.
Подождите
wait -n
Это ожидает завершения любого фонового задания.
Из-за -nопции, это требует bash 4.3 или лучше.
Убийство
pkill -P $$
Это убивает любую работу, для которой текущий процесс является родительским. Другими словами, это убивает любой фоновый процесс, который все еще выполняется.
Если вашей системы нет pkill, попробуйте заменить эту строку на:
kill 0
что также убивает текущую группу процессов .
Легко тестируемый пример
Изменяя скрипт, мы можем протестировать его даже без gulpустановленного:
$ cat script.sh
#!/bin/bash
{ sleep $1; echo one; } &
{ sleep $2; echo two; } &
wait -n
pkill -P $$
echo done
Вышеприведенный скрипт может быть запущен как bash script.sh 1 3и первый процесс завершается первым. В качестве альтернативы, можно запустить его как, bash script.sh 3 1и второй процесс завершится первым. В любом случае можно увидеть, что это работает как хотелось бы.
gulp ./fronend/serve && gulp ./backend/serve --verbose?