Вот что мне нужно, чтобы это произошло:
- начать процесс А в фоновом режиме
- ждать х секунд
- начать процесс B на переднем плане
Как я могу заставить ожидание случиться?
Я вижу, что «сон», кажется, останавливает все, и я на самом деле не хочу «ждать», пока процесс А завершится полностью. Я видел циклы, основанные на времени, но мне интересно, есть ли что-нибудь чище.
sleep
останавливает процесс А? Можете ли вы показать процесс тестирования, который вы используете, или вывести показательный результат? Если процесс-A является остановка, это более вероятно , что он пытается читать с терминала во время работы в фоновом режиме и получать остановился по этой причине, а не все , что связано сsleep
.process_a </dev/null &
присоединит его стандартный ввод ,/dev/null
а не TTY, и это может быть достаточно , чтобы избежать этой проблемы.Ответы:
Если я не понимаю ваш вопрос, его можно просто выполнить с помощью этого короткого сценария:
(и добавьте дополнительный
wait
в конце, если вы хотите, чтобы ваш скрипт ждалprocess_a
завершения, прежде чем выйти).Вы даже можете сделать это как однострочник, без необходимости сценария (как предложено @BaardKopperud):
источник
bash
, подойдет любая оболочка, включая вашу системуsh
, поэтому вам не нужно добавлять зависимость от bash для вашего скрипта.Вы можете использовать оператор фонового управления (&) для запуска процесса в фоновом режиме и
sleep
команду для ожидания перед запуском второго процесса, а именно:Вот пример двух команд, которые выводят сообщения с метками времени:
Запустите его, чтобы убедиться, что он демонстрирует желаемое поведение:
источник
Мне нравится ответ @ dr01, но он не проверяет код выхода, и поэтому вы не знаете, успешны ли вы или нет.
Вот решение, которое проверяет коды выхода.
обычно я сохраняю PID в массиве bash, а затем проверка pid является циклом for.
источник
A & sleep x; B; ret=$?; wait "$!" || exit "$ret"
process_b
работать на переднем плане. Предположительноprocess_a
может выйти, когдаprocess_b
работает, но вы все равно можетеwait
получить его и получить статус выхода после того, как вы получили статус выхода на переднем планеprocess_b
обычным способом,$?
напрямую.