У меня есть awk-скрипт, который разбивает большой файл на несколько файлов по некоторым условиям. Затем я запускаю другой скрипт по каждому файлу параллельно.awk: Вывод на разные процессы
awk -f script.awk -v DEST_FOLDER=tmp input.file
find tmp/ -name "*.part" | xargs -P $ALLOWED_CPUS --replace --verbose /bin/bash -c "./process.sh {}"
Возникает вопрос: есть ли способ запустить ./process.sh:
- перед первым сценарием будет сделано, потому что process.sh обрабатывает строки файла по линии (одна линия слишком долго передаваться непосредственно в xargs);
- каждый новый файл имеет заголовок (добавлен в script.awk), который должен быть запущен до остальной части файла;
- ограничение количества параллельных процессов;
- GNU parallel, inotifywait не является вариантом;
- Предположим, что папка dest опущена, имя файла неизвестно.
Цель оптимизации - избавиться от ожидания до тех пор, пока awk не будет выполнен, пока некоторые файлы готовы к обработке.
какой отказ может быть допущен? Например. ваш awk пишет 100 строк за 1 минуту до файла f1, но ваш скрипт.sh просто забрал 10 секунд, чтобы прочитать 10 строк из f1 и выполнил эту работу. Это нормально? – Kent
Создайте именованные каналы для каждого из выходных «файлов». Обозначьте process.sh для каждого из них. Вы не будете ограничивать количество процессов таким образом, но поскольку скорость вашего awk-скрипта является ограничивающим фактором, все, кроме одного или двух ваших процессов, будут заблокированы, ожидая большего выхода awk. Кроме того, когда ваш скрипт awk заканчивается одним файлом и закрывает его, соответствующий процесс чтения получит EOF и должен выйти. –