
Часто бывает очень полезно запускать команды параллельно в скрипте оболочки, но я не могу найти способы сделать это. Возможно ли это? Если да, то как мне этого добиться? Меня в основном интересует, как это сделать для 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
, что команда должна игнорировать «зависания», а амперсанд, &
добавленный к ней, является командой оболочки, которая сообщает системе о необходимости запустить команду как фоновый процесс. Дополнительная информация о его использованииможно найти здесь.
При запуске такой команды процесс запустится, вы будете перенаправлены обратно в командную строку и сможете выйти из сеанса терминала или даже заняться чем-то другим, не связанным с этой командой, во время этого сеанса терминала.