Файл не может быть найден в небольшой части отправленных работ
Я пытаюсь запустить очень большой набор пакетных заданий в кластере RHEL5, который использует файловую систему Luster. Я получал странную ошибку примерно с 1% рабочих мест: они не могли найти текстовый файл, который они все используют для управления. Сценарий, который воспроизводит ошибку, выглядит так:
#!/usr/bin/env bash
#PBS -t 1-18792
#PBS -l mem=4gb,walltime=30:00
#PBS -l nodes=1:ppn=1
#PBS -q hep
#PBS -o output/fit/out.txt
#PBS -e output/fit/error.txt
cd $PBS_O_WORKDIR
mkdir -p output/fit
echo 'submitted from: ' $PBS_O_WORKDIR
files=($(ls ./*.txt | sort)) # <-- NOTE THIS LINE
cat batch/fits/fit-paths.txt
Для некоторой небольшой части заданий поток ошибок выводит:
cat: batch/fits/fit-paths.txt: No such file or directory
Как ни странно, но становится страннее.
Когда я меняю files=($(ls ./*.txt | sort))
линия к
files=($(ls batch/fits/*.txt | sort))
Задания выполняются без ошибок! Излишне говорить, что это далеко не удовлетворительно: я бы предпочел, чтобы моя работа не зависела от черной магии (хотя черная магия лучше, чем отсутствие магии).
Есть идеи, что здесь происходит?
1 ответ
Попробуйте заменить
files=($(ls ./*.txt | sort))
с
files=(./*.txt)
Обычно оболочка автоматически сортирует результаты глобуса и - в отличие от анализа вывода ls(1), который никогда не должен выполняться в сценариях переносимой оболочки - правильно обрабатывает цитирование специальных символов.
Хотя это проблема, только если у вас есть файлы с определенными метасимволами оболочки. Кандидатами здесь являются пробел, табуляция, перевод строки и, возможно, возврат каретки.