2013-12-20 3 views
0

У меня есть 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 не будет выполнен, пока некоторые файлы готовы к обработке.

+0

какой отказ может быть допущен? Например. ваш awk пишет 100 строк за 1 минуту до файла f1, но ваш скрипт.sh просто забрал 10 секунд, чтобы прочитать 10 строк из f1 и выполнил эту работу. Это нормально? – Kent

+0

Создайте именованные каналы для каждого из выходных «файлов». Обозначьте process.sh для каждого из них. Вы не будете ограничивать количество процессов таким образом, но поскольку скорость вашего awk-скрипта является ограничивающим фактором, все, кроме одного или двух ваших процессов, будут заблокированы, ожидая большего выхода awk. Кроме того, когда ваш скрипт awk заканчивается одним файлом и закрывает его, соответствующий процесс чтения получит EOF и должен выйти. –

ответ

1

После того, как вы создали файл, вы можете передать имя файла в процессе или ввода сценария:

awk '{print name_of_created_file | "./process.sh &"}' 

& посылает process.sh на задний план, так что они могут работать параллельно. Однако это расширение gawk, а не POSIX. Проверьте manual

+0

Как это выполняет требование «предельного количества параллельных процессов»; ? –

+0

В настоящее время нет, вы правы. Первое, что приходит в голову, это некоторая логика pidfile, но это сложно. – hek2mgl

1

Вы в основном даете ответ самостоятельно: GNU Parallel + inotifywait будет работать.

Поскольку вам не разрешено использовать inotifywait, вы можете сделать замену inotifywait. Если вам разрешено писать собственный скрипт, вам также разрешено запускать GNU Parallel (так как это только скрипт).

Так что-то вроде этого:

awk -f script.awk -v DEST_FOLDER=tmp input.file & 
sleep 1 
record file sizes of files in tmp 
while tmp is not empty do 
    for files in tmp: 
    if file size is unchanged: print file 
    record new file size 
    sleep 1 
done | parallel 'process {}; rm {}' 

Предполагается, что awk будет производить некоторый вывод с одной секунды. Если это займет больше времени, отрегулируйте сон соответственно.

Смежные вопросы