Ho un problema di scripting della shell in cui mi viene fornita una directory piena di file di input (ogni file contenente molte righe di input) e devo elaborarli singolarmente, reindirizzando ciascuno dei loro output su un file univoco (ovvero file_1.input necessario per essere catturato in file_1.output e così via).
Prima del parallelismo , vorrei solo scorrere ogni file nella directory ed eseguire il mio comando, mentre eseguivo una sorta di tecnica timer / conteggio per non sovraccaricare i processori (supponendo che ogni processo avesse un runtime costante). Tuttavia, so che non sarà sempre il caso, quindi usare una soluzione simile a "parallela" sembra il modo migliore per ottenere il multi-threading di script di shell senza scrivere codice personalizzato.
Mentre ho pensato ad alcuni modi per montare in parallelo per elaborare ciascuno di questi file (e permettendomi di gestire i miei core in modo efficiente), sembrano tutti confusi. Ho quello che penso sia un caso d'uso piuttosto semplice, quindi preferirei tenerlo il più pulito possibile (e nulla negli esempi paralleli sembra saltar fuori come il mio problema.
Qualsiasi aiuto sarebbe apprezzato!
esempio di directory di input:
> ls -l input_files/
total 13355
location1.txt
location2.txt
location3.txt
location4.txt
location5.txt
script:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
Aggiornamento : dopo aver letto la risposta di Ole di seguito, sono stato in grado di mettere insieme i pezzi mancanti per la mia implementazione parallela. Mentre la sua risposta è ottima, ecco la mia ricerca aggiuntiva e le note che ho preso:
Invece di eseguire l'intero processo, ho pensato di iniziare con un comando proof of concept per provare la sua soluzione nel mio ambiente. Vedi le mie due diverse implementazioni (e note):
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
Usa find (non ls, che può causare problemi) per trovare tutti i file applicabili nella mia directory dei file di input, quindi reindirizza i loro contenuti in una directory e file separati. Il mio problema dall'alto era la lettura e il reindirizzamento (la sceneggiatura reale era semplice), quindi sostituire la sceneggiatura con cat era una bella prova del concetto.
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
Questa seconda soluzione utilizza il paradigma della variabile di input di parallel per leggere i file, tuttavia per un principiante, questo era molto più confuso. Per me, usare find a e pipe ha soddisfatto perfettamente le mie esigenze.