Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux上并行执行接受多个输入的作业_Linux_Parallel Processing_Xargs_Gnu Parallel - Fatal编程技术网

在Linux上并行执行接受多个输入的作业

在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

我有一个包含路径列表的文件。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 ~/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对其进行报价。