使用gnu parallel在远程服务器上运行wine中的windows程序

时间:2016-08-03 07:05:06

标签: parallel-processing gnu bioinformatics wine gnu-parallel

我有一个工作脚本,由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”实例?

1 个答案:

答案 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 {} {//} {%}
  • - wd ... =在远程计算机上创建临时workdir
  • - tf' {= s:(。*)/:$ 1 /./:=}' = transfer {}到workdir - 将其保存为没有dir的名称
  • - trc {/.}.result =转移到workdir之后,然后运行命令,然后转移{/.}.result,然后从workdir删除{}和{/.}.result
  • - env doit =转移函数doit,以便可以在远程系统上使用
  • -S:,server1,server2.example.com =使用本地计算机和2台服务器
  • doit = execute doit
  • {} =参数
  • {//} =参数dir
  • {%} =职位空缺

我鼓励您阅读https://www.gnu.org/software/parallel/parallel_tutorial.html,因为您正在使用相当高级的GNU Parallel。

相关问题