在Linux上并行执行接受多个输入的作业
我有一个包含路径列表的文件。e、 g: /run/user/1007/gvfs/smb share:server=xeonator,share=c/Results/Normals/8_mo/CNMC_N_191/ /运行/user/1007/gvfs/smb共享:server=xeonator,share=c/Results/Normals/8_-mo/204-196/ 我有一个程序(我们称之为“prog”),它接受3个参数、2个输入文件名和1个输出文件名。正常执行:在Linux上并行执行接受多个输入的作业,linux,parallel-processing,xargs,gnu-parallel,Linux,Parallel Processing,Xargs,Gnu Parallel,我有一个包含路径列表的文件。e、 g: /run/user/1007/gvfs/smb share:server=xeonator,share=c/Results/Normals/8_mo/CNMC_N_191/ /运行/user/1007/gvfs/smb共享:server=xeonator,share=c/Results/Normals/8_-mo/204-196/ 我有一个程序(我们称之为“prog”),它接受3个参数、2个输入文件名和1个输出文件名。正常执行: prog ~/A.txt
prog ~/A.txt ~/B.txt ~/out.txt
我希望使用基于文件每行构造的参数并行执行我的程序,例如:
prog /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/CNMC_N_191/A.txt /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/CNMC_N_191/B.txt /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/CNMC_N_191/out.txt
prog /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/204-196/A.txt /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/204-196/B.txt /run/user/1007/gvfs/smb-share:server=xeonator,share=c/Results/Normals/8_mo/204-196/out.txt
我一直在尝试使用xargs和gnupallel,但我无法为这些工具构建合适的命令行。以下是我的尝试:
cat ListPaths.txt | xargs -I '{}' -n 1 -P 8 ./SkullSegmenter/SkullSegmenter '{}'A.txt '{}'B.txt '{}'out.txt
但这并不能正确地构造参数。有人能帮我吗?这个应该可以:
cat ListPaths.txt | parallel ./SkullSegmenter/SkullSegmenter {}A.txt {}B.txt {}out.txt
使用--dry run
进行测试,以查看这些是否是您想要运行的命令:
cat ListPaths.txt | parallel --dry-run ./SkullSegmenter/SkullSegmenter {}A.txt {}B.txt {}out.txt
我将我的列表重新格式化为完整的命令,并使用这个问题的答案:我运行:
cat ListPaths.txt | parallel-j 8./skullsecter/skullsecter{}subjectbonewithoutsuitesindividualv2.nrrd{}RegisteredSegmentedTemplateV2.nrrd{}SegmentedSubjectV2.nrrd
I get:SubjectBoneWithoutSuitesinDividualv2.nrrd7/gvfs/smb共享:server=xeonator,share=c/Results/Normals/18_mo/CNMC_N_118/例外行:143 subjectBoneWithoutSuitesinDividualv2.nrr读取文件/run/user/1007/gvfs/smb共享:server=xeonator,share=c/Results/Normals/18_mo/CNMC_N_118/文件不存在。SubjectBoneWithoutSuitersInDividualv2.nRderServer=xeonator,share=c/Results/Normals/18_-mo/CNMC\u N_118/
看起来只有来自文件的路径作为参数传递,它没有与文件名A、B和out合并。由于我没有使用SkullSegmenter,您可以使用命令echo
重新测试,或者使用一些简短的输入,那么破译就不那么难了?另外:--试运行
给出了什么?我又试了一次,这次成功了-路径传递正确。与此同时,我获得了sudo特权,这样我就可以在一个更理智的位置安装共享(~/y
)。以~/y/
开头的传递路径无效(未找到文件),但写入完整路径(/home/dzenan/y/
)无效。通过SSH运行这些东西会有所不同吗?无论如何,感谢@Ole TangeGNU Parallel提供的帮助,因此如果输入是~/y
,那么GNU Parallel将其视为~/y
,而不是您的homedir/y
。您可以通过在命令前面加上“eval”
”来强制shell对其进行报价。