远程 GNU 并行作业获取“/bin/bash:权限被拒绝”

Remote GNU Parallel job gets "/bin/bash: Permission denied"

遇到问题 运行 分布式模式下的 GNU 并行作业(即通过 --sshloginfile 跨多台机器)并发现即使每个作业都 运行机器作为同一用户(或至少在文件中以这种方式指定给 --sshloginfile(例如 myuser@myhostname00x)),当作业尝试访问文件时出现 "Permission denied" 错误。尽管能够(无密码)ssh 到有问题的远程节点和 ls 并行作业声称它没有权限的文件(指定的路径是共享的文件系统,并且 NFS 安装在所有节点)。

有一个像

这样的节点列表文件
me@host001
me@host005
me@host006

实际的并行作业看起来像

bcpexport() {
    <do stuff to arg  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 全局模式 returns 文件来自目录。 运行 此作业在单节点模式下工作正常,但是当 运行 跨并行-nodes.txt 文件中的所有节点抛出

/bin/bash: line 27: /path/to/file001: Permission denied

/bin/bash: line 27: /path/to/file002: Permission denied

...and so on for all the files...

如果有人知道这里会发生什么,建议或调试建议将不胜感激。

我认为问题在于额外的 $:

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

除非您将 shell 变量 $bcpexport 设置为您可能想要的 bcpexport(无 $)。

如果$bcpexport未定义,则shell将替换为空。因此 --env 会吃掉下一个参数,所以你真的会 运行:

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

这将执行 {} 作为命令,这正是您所经历的。

所以试试这个:

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