#bash #terminal #parallel-processing
Вопрос:
Мне нужно выполнить несколько команд (например, 2000 одновременно) одновременно и очень быстро.
Один из способов-выполнить их с «amp;» между каждой командой, что действительно быстро, но я получаю результаты (формат json) перепутанными, так что я не могу просто загрузить вывод как json.
Я также попытался использовать «параллель». С помощью этой команды я получаю команды в правильном json, но это занимает гораздо больше времени.
Есть ли способ выполнить команды с помощью «amp;» и не перепутать выходные данные?
Комментарии:
1. Нет, если все они пишут на стандартный вывод, потому что оболочка не знает, как объединить несколько авторов. Перенаправьте выходные данные каждой команды в отдельный файл и объедините их, когда (или по мере необходимости) команды будут выполнены.
2. Команда bash
wait
будет полезна в этой ситуации.3. Если порядок важен, то вы должны выполнять команды последовательно. Тем не менее, если порядок не так важен (например, заполнение хэша JSON или неупорядоченного массива), то можно правильно объединить все с помощью файла, но каждой команде необходимо сразу записать свой вывод, и этот вывод должен быть меньше максимального количества байтов, гарантированного O_APPEND (зависит от ОС).
Ответ №1:
Я сомневаюсь, что процесс создания 2000 может быть хорошей идеей, и параллель даст вам больше контроля, сказав это, можно было бы использовать что-то простое, подобное этому
N=2000 for ((n=0; nlt;N; n )) do mycommand $n gt; out-$n.txt amp; done wait for ((n=0; nlt;N; n )) do cat out-$n.txt done
Ответ №2:
Вы можете добавить команду сообщения в JSON с помощью команды jq.
Я не знаю, как вы называете свои команды. Но вы можете добавить дополнительные объекты в JSON.
command |jq '. {"key2": "value2"}'
Пример кода
command | jq '. {"commands": "$(script execute)"}'