Запуск параллельных экземпляров команды внутри скрипта оболочки

Запуск параллельных экземпляров команды внутри скрипта оболочки

Позвольте мне начать с того, что я все еще изучаю bash-скриптинг и не знаю многих вещей. Если я что-то упустил, не стесняйтесь ругать меня, как вам будет угодно.

Далее я создаю простой скрипт bash для запуска ping на 2 разных хоста и вывода в файл. Я уже это сделал, и это работает. Из любопытства я добавил в скрипт вывод даты после и до вывода ping, чтобы знать, сколько времени занял запуск ping. Я установил ping на интервал в 1 секунду, 10 ping, 2 хоста. Моя первая дата (была давно...) имела 14:36:20 в качестве часовой метки. Вторая дата (после ping) имела 14:36:40 в качестве часовой метки.

Итак, дата ждала завершения обоих пингов. Это означает, что пинги выполнялись последовательно.

Могу ли я заставить их работать одновременно, чтобы тратить на выполнение скрипта 10 секунд вместо 20?

Вот фрагмент моего сценария:

date >> teste.txt
cat hosts.txt |  while read output
do   ping -c 10 -i 1 "$output" >> teste.txt
done
date >> teste.txt

Я хочу, чтобы этот скрипт выполнил еще несколько задач, но обещаю, что спрошу только в том случае, если не найду удовлетворительного ответа на Barsa.

PS: hosts.txt — это место, где я храню хосты, которые хочу пинговать.

решение1

Формулировку вашего вопроса немного сложно понять, но я думаю, вы ищете что-то вроде:

command & 
command &
wait

Скрипт выполнит две команды в фоновом режиме и будет ждать ответа.

Однако в вашем случае вам нужно быть осторожным с состоянием гонки. Вероятно, вы захотите отправить вывод отдельных команд во временные файлы, а затем cat их в основной файл, поэтому вы, вероятно, сделаете что-то вроде:

command > "${tmp1}" & 
command > "${tmp2}" & 
wait
cat "${tmp1}" "${tmp2}" >> "${main}"
rm -f "${tmp1}" "${tmp2}"

Обновление: вы можете попробовать xargs (напримерhttps://stackoverflow.com/questions/15755422/linux-bash-script-to-ping-multiple-hosts-simultaneously)

решение2

С помощью GNU Parallel вы можете сделать следующее:

date >> teste.txt
cat hosts.txt |  parallel -j0 ping -c 10 -i 1 {} >> teste.txt
date >> teste.txt

Связанный контент