Выполнение двух или более команд одновременно в скрипте оболочки

Выполнение двух или более команд одновременно в скрипте оболочки

Часто бывает очень полезно запускать команды параллельно в скрипте оболочки, но я не могу найти способы сделать это. Возможно ли это? Если да, то как мне этого добиться? Меня в основном интересует, как это сделать для fish.

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

решение1

Самый простой подход — это &,этот другой ответправильно. Он также поддерживает, nohupно nohupперенаправляет stdin, stdout и stderr, что вам может быть нужно или не нужно. ЧитатьРазница между nohup, disownи&и принять обоснованное решение.

Другой подход — parallel.Это будет полезно, если команды, которые вы хотите распараллелить,похожи друг на другаи вы можете создать узор.

Базовый вариант инструмента (от moreutils, как минимумв Дебиане) позволяет ограничить количество заданий, выполняемых одновременно.ГНУparallelболее продвинутый. Если задания, которые вы хотите запустить, генерируют вывод, то следующие опции будут особенно полезны:

--group
Групповой вывод. Вывод каждого задания группируется и выводится только после завершения команды. Сначала stdout (стандартный вывод), а затем stderr (стандартная ошибка). […]

(источник)

( --groupвключено по умолчанию, поэтому обычно вам не нужно использовать его явно.)

--keep-order
-k
Сохраняйте последовательность вывода такой же, как и порядок ввода. Обычно вывод задания будет напечатан сразу после его завершения. […] -kвлияет только на порядок, в котором печатается вывод, а не на порядок, в котором запускаются задания.

(источник)

С ними вывод из нескольких заданий будет организован, чего вы не можете получить от &. Иногда вам может быть не важен вывод, но все равно важна последовательность; как вэтот мой ответгде GNU parallelиспользуется для распараллеливания нескольких curlпроцессов и получения статуса выхода из каждого, сохраняя последовательность.

В Debian GNU parallelнаходится в пакете с именем parallel. Как отдельный исполняемый файл parallelможет быть запущен из любой оболочки.

решение2

Лучший способ сделать это — объединить добавление в nohupначало команды и &в конец команды.

Неясно, какова ваша основная цель, но надеюсь, что это поможет!

Чтобы запустить любую команду в фоновом режиме на компьютере с Linux, необходимо добавить к нейnohupи добавить &в конец.

Итак, окончательная команда будет такой:

nohup [your command] &

Означает nohup, что команда должна игнорировать «зависания», а амперсанд, &добавленный к ней, является командой оболочки, которая сообщает системе о необходимости запустить команду как фоновый процесс. Дополнительная информация о его использованииможно найти здесь.

При запуске такой команды процесс запустится, вы будете перенаправлены обратно в командную строку и сможете выйти из сеанса терминала или даже заняться чем-то другим, не связанным с этой командой, во время этого сеанса терминала.

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