Я в настоящее время выполняю freesurfer, и я пытаюсь выполнить несколько recon-all
команды. Машина только может обработать 10 сборок сразу. Я хочу создать сценарий удара, который работает recon-all
команда на каждом файле в каталоге, но только 10 файлах за один раз.
Мой текущий скрипт запущен для всех файлов один за другим:
for f in *.nii; do
if [ -f ${f} ]; then
echo $f
recon-all -i $f -s $f"DIR" -all > $f"_log3.txt" &
fi
done
Я в основном должен установить его так 10-е выполнения сборки без и команда, таким образом, это должно будет ожидать, до, который завершен, прежде чем следующие 10 запускаются.
Какие-либо предложения?
ОБНОВЛЕНИЕ:
Вот завершенный код после решения:
find -type f -name '*.nii' -print0 |xargs -n10 -0 sh -c '
echo "Running: ${0#./}"
recon-all -i "$0" -s "$0DIR" -all > "$0_log.txt" &
echo "Running: ${1#./}"
recon-all -i "$1" -s "$1DIR" -all > "$1_log.txt" &
echo "Running: ${2#./}"
recon-all -i "$2" -s "$2DIR" -all > "$2_log.txt" &
echo "Running: ${3#./}"
recon-all -i "$3" -s "$3DIR" -all > "$3_log.txt" &
echo "Running: ${4#./}"
recon-all -i "$4" -s "$4DIR" -all > "$4_log.txt" &
echo "Running: ${5#./}"
recon-all -i "$5" -s "$5DIR" -all > "$5_log.txt" &
echo "Running: ${6#./}"
recon-all -i "$6" -s "$6DIR" -all > "$6_log.txt" &
echo "Running: ${7#./}"
recon-all -i "$7" -s "$7DIR" -all > "$7_log.txt" &
echo "Running: ${8#./}"
recon-all -i "$8" -s "$8DIR" -all > "$8_log.txt" &
echo "Running: ${9#./}"
recon-all -i "$9" -s "$9DIR" -all > "$9_log.txt"
echo "Continuing to next batch"'
echo "Batch Completed!!!!!"
Ваш сценарий не выполняет все Ваши файлы сразу, но один за другим. И Вы выполняете передовод "против" команды - все в фоне, не ожидая к его ответу, таким образом, в следующем запуске он выбирает следующий файл для выполнения и все еще в фоне.
Использовать find
с xargs
и это будет работать за следующим файлом после предыдущего, законченного один за другим.
find -type f -name '*.nil' -print0 |xargs -n1 -0 sh -c 'recon-all -i "$1" -s "$1DIR" -all > "$1_log3.txt"' sh
для выполнения в 10 пакетах сделать
find -type f -name '*.nil' -print0 |xargs -n10 -0 sh -c '
recon-all -i "$1" -i "$2" -i "$3" -i "$4" -i "$5" -i "$6" -i "$7" -i "$8" -i "$9" -i "$10" -s "$1DIR" -all > "$1_log3.txt"' sh
обратите внимание что -s
предмет берет от первого имени файла выше.