Удаленное задание GNU Parallel получает "/ bin / bash: разрешение отклонено" - PullRequest
0 голосов
/ 10 октября 2018

Возникла проблема с запуском задания GNU Parallel в распределенном режиме (т. Е. На нескольких машинах через --sshloginfile) и обнаружилось, что, хотя задание выполняется на каждой машине под одним и тем же пользователем (или, по крайней мере, так было продиктовано)в файле, передаваемом --sshloginfile (например, myuser @ myhostname00x)), появляется ошибка «Отказано в доступе», когда задание пытается получить доступ к файлу.Это происходит несмотря на то, что ssh может (без пароля) подключаться к рассматриваемым удаленным узлам и ls к файлам, для которых задание Parallel заявляет, что у него нет разрешений (указанный путь - к файловой системе, которая является общей, и NFS смонтирована на всех узлах.).

Имеет файл списка узлов типа

me@host001
me@host005
me@host006

, и фактическое задание Parallel выглядит как

bcpexport() {
    <do stuff to arg $1 to BCP copy to a MSSQL DB>
}
export -f bcpexport
parallel -q -j 10 --sshloginfile $basedir/src/parallel-nodes.txt --env $bcpexport \
    bcpexport {} "$TO_SERVER_ODBCDSN" $DB $TABLE $USER $PASSWORD $RECOMMEDED_IMPORT_MODE $DELIMITER \
    ::: $DATAFILES/$TARGET_GLOB

, где шаблон глобуса $DATAFILES/$TARGET_GLOB возвращает файлы изкаталог.Выполнение этого задания в режиме с одним узлом работает нормально, но при запуске на всех узлах в файле parallel-node.txt выдается

/ bin / bash: строка 27: / path / to / file001:Разрешение отклонено

/ bin / bash: строка 27: / путь / к / file002: разрешение отклонено

... и т. Д. Для всех файлов ...

Если кто-нибудь знает, что здесь может происходить, мы будем благодарны за советы или советы по отладке.

1 Ответ

0 голосов
/ 10 октября 2018

Я думаю, что проблема в дополнительных $:

parallel [...] --env $bcpexport bcpexport {} [...]

Если вы не задали для переменной оболочки $bcpexport значение, которое вы, вероятно, имели в виду bcpexport (нет $).

Если $bcpexport не определено, то оболочкой он будет заменен ничем.Таким образом, --env будет использовать следующий аргумент, так что вы действительно запустите:

parallel [...] --env bcpexport {} [...]

, который выполнит {} как команду, и это именно то, что вы испытываете.

Итакпопробуйте это вместо:

parallel [...] --env bcpexport bcpexport {} [...]
...