У мене є проблема зі скриптом оболонки, де мені надається каталог, що містить повний вхідний файл (кожен файл містить багато рядків введення), і мені потрібно обробляти їх окремо, перенаправляючи кожен їх вихід на унікальний файл (він же, файл_1.input потребує бути захопленим у file_1.output тощо).
Попередньо паралельно я просто повторюю кожен файл у каталозі та виконую свою команду, виконуючи якусь техніку таймера / підрахунку, щоб не перевантажувати процесори (припускаючи, що кожен процес мав постійний час виконання). Однак я знаю, що це не завжди так, тому використання "паралельного" подібного рішення виглядає найкращим способом отримати багатопотоковий сценарій оболонки без написання спеціального коду.
Хоча я продумав деякі способи паралельно обробляти кожен із цих файлів (і дозволяючи мені ефективно керувати своїми ядрами), всі вони здаються хиткими. У мене є те, що, на мою думку, є досить простим випадком використання, тому я вважаю за краще тримати його максимально чисто (і нічого з паралельних прикладів, схоже, не вискочить, як моя проблема.
Будь-яка допомога буде вдячна!
Приклад вхідного каталогу:
> ls -l input_files/
total 13355
location1.txt
location2.txt
location3.txt
location4.txt
location5.txt
Сценарій:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
Оновлення : Прочитавши відповідь Оле, представлену нижче, я зміг зібрати пропущені фрагменти для моєї власної паралельної реалізації. Хоча його відповідь чудова, ось моє додаткове дослідження та замітки, які я взяв:
Замість того, щоб запустити мій повний процес, я зрозумів, що почати з доказів концепції концепції, щоб довести його рішення в моєму середовищі. Перегляньте дві мої різні реалізації (та примітки):
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
Використовує find (не ls, що може спричинити проблеми), щоб знайти всі застосовні файли в моєму каталозі вхідних файлів, а потім перенаправляє їх вміст в окремий каталог та файл. Моє питання зверху було читанням і перенаправленням (власне сценарій був простим), тому заміна сценарію котом була прекрасним доказом концепції.
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
Це друге рішення використовує парадигму змінної паралельної вхідної системи для читання файлів, однак для початківців це було набагато заплутаніше. Для мене, використовуючи функцію find a and pipe, просто задовольнили мої потреби.