I am processing a text file with multiple parallel processes spawned by xargs. I also need to capture the stdout from each process into a separate log file. Below is an example where the output from each process is interleaved into a single file -- not what I want.
Ideally, each logfile should be numbered by the file line number, that is, logfile-1, logfile-2, etc.
cat inputfile.txt | xargs -n 1 -P 8 ./myScript.sh | tee logfile
It would be nice to avoid an external wrapper script if possible, but if there is a way to wrap myScript with a here document, that would work.
Try this:
nl inputfile.txt | xargs -n 2 -P 8 sh -c './myScript.sh "$1" > logfile-$0'
This assumes each argument in inputfile.txt
is on its own line and contains no spaces. The nl
command numbers each line, which pairs each argument with a unique number. The xargs
commands takes two arguments at time, the first the line number, the second the corresponding line from inputfile.txt
, and passes them to sh
. The sh
command uses the arguments to generate the output file name and the argument to myScript.sh
respectively.
You could use GNU Parallel instead and its -k
option to keep the output in order, in a single log file:
cat input | parallel -k ./myScript.sh > file.log
You can add -j 8
after parallel
to keep 8 cores busy, but it will keep all cores busy by default anyway.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With