我有一个工作脚本,由Mark Setchell(以及Ole Tange)在这个论坛上提供,它允许我使用“parallel”在wine下运行windows程序“msvar.exe”的多个实例。我目前在双六声道计算机上运行多达20个实例。这是脚本(这个用于Centos 6.8,它没有realpath命令);
doit() {
echo Processing $1
# cd $(dirname $(realpath "$1"));
cd $(dirname $(readlink -f "$1"));
WINEPREFIX=$HOME/slot{%} wine /home/msvar/msvar0.4.1b/msvar.exe
}
export -f doit
find /home/msvar/MSVAR_ORC_NEWUPLOAD -name INTFILE -type f | parallel doit
我有其他几个双六声道服务器,并希望使用“parallel”在这些其他服务器上运行更多“msvar.exe”实例。我已阅读“并行”文档,但对如何将远程服务器合并到此脚本感到困惑。在帮助文件中的一个示例后,我尝试通过在脚本中的“parallel”和“doit”命令之间添加“-S服务器IP地址”来添加服务器,但这只是导致错误说“doit”不是命令,正如你所料。如何修改此脚本以将远程服务器合并到“并行”使用的cpu池中,以便我可以运行更多“msvar.exe”实例?
答案 0 :(得分:1)
我很困惑你的脚本因为这行而起作用了:
WINEPREFIX=$HOME/slot{%} wine /home/msvar/msvar0.4.1b/msvar.exe
GNU Parallel不会替换函数中的{%},而只会替换命令行中的命令,所以我认为你的WINEPREFIX设置为你不期望的东西。
这应该给1 2 3 4最新版本的GNU Parallel:
parallel -S 4/: echo {%} ::: a b c d
要远程运行作业,您需要使用ssh才能工作。所以这必须奏效:
parallel -S server1 echo ::: foo bar
您还需要将该功能导出到服务器。因此,您需要最新版本的GNU Parallel,其中包含:
myfunc() { echo OK "$@"; }
export -f myfunc
parallel -S server1 --env myfunc myfunc ::: this works
您还需要传输文件,因此必须在两端安装rsync
,这样才能正常工作:
myfunc() { echo OK "$@"; echo in myfunc >> "$1".result; }
export -f myfunc
echo foofile > foo.txt
echo barfile > bar.txt
parallel --trc {.}.result -S server1 --env myfunc myfunc {.} ::: foo.txt bar.txt
cat foo.result bar.result
您的find
命令提供了文件的绝对路径,但我们需要将其转移到相对于远程工作区的位置。这样做的方法是在路径中插入/./:
/foo/bar/quux/./baz
会阅读/foo/bar/quux/baz
,但会将其复制到workdir/baz
。这将插入/./正确的位置:
--transferfile '{= s:(.*)/:$1/./: =}'
目前尚不清楚您是否有结果文件。如果没有,您可以使用--transfer --cleanup
代替--trc {/.}.result
。如果您只需要INTFILE作为输入,或者msvar.exe
使用目录中的其他文件,也不清楚。以下假设您只需要它。否则,您需要添加--basefile otherfile
或--transferfile {= s:(.*)/:$1/./: =}.other
。
结合所有这些(未经测试):
doit() {
file="$1"
dir="$2"
slot="slot$3"
cd "$dir" # Only used on local installation, remote uses --wd ...
echo Processing "$file"
WINEPREFIX=$HOME/"$slot" wine /home/msvar/msvar0.4.1b/msvar.exe
# Assume msvar writes "$file".result
}
export -f doit
仅限本地:
find /home/msvar/MSVAR_ORC_NEWUPLOAD -name INTFILE -type f | parallel doit {} {//} {%}
当上述工作时,这应该适用于远程:
find /home/msvar/MSVAR_ORC_NEWUPLOAD -name INTFILE -type f |
parallel --wd ... --tf '{= s:(.*)/:$1/./: =}' --trc '{/.}'.result --env doit -S :,server1,server2.example.com doit {} {//} {%}
doit
,以便可以在远程系统上使用我鼓励您阅读https://www.gnu.org/software/parallel/parallel_tutorial.html,因为您正在使用相当高级的GNU Parallel。