【问题标题】:Pass command line arguments via sbatch通过 sbatch 传递命令行参数
【发布时间】:2014-12-30 16:06:26
【问题描述】:

假设我有以下简单的 bash 脚本,我想通过 SLURM 提交到批处理服务器:

#!/bin/bash

#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"

hostname

exit 0

在这个脚本中,我只想将hostname 的输出写入我通过命令行控制其全名的文本文件,如下所示:

login-2:jobs$ sbatch -D `pwd` exampleJob.sh 1
Submitted batch job 203775

不幸的是,我的最后一个命令行参数 (1) 似乎没有通过 sbatch 解析,因为创建的文件没有我要查找的后缀,并且字符串“$1”是按字面意思解释的:

login-2:jobs$ ls
errFile$1.txt  exampleJob.sh outFile$1.txt

我环顾了SOelsewhere 的地方,但运气不佳。本质上,我正在寻找相当于启用 Torque 的集群中的 qsub 实用程序的 -v 开关。

编辑:正如底层评论线程中所提到的,我以艰难的方式解决了我的问题:而不是让一个脚本多次提交到批处理服务器,每个脚本都有不同的命令行参数,我创建了一个“主脚本”,它简单地将相同的内容回显并重定向到不同的脚本,每个脚本的内容由传递的命令行参数更改。然后我通过sbatch 将所有这些提交到我的批处理服务器。但是,这并没有回答原始问题,因此我犹豫是否将其添加为我的问题的答案或将此问题标记为已解决。

【问题讨论】:

  • 我不知道 SLURM。您能否将脚本简化为touch outfile${1}.txt 行,以便我们尝试重现错误并修复它?
  • 1 被传递给脚本,但不考虑文件名,因为 slurm 预处理文件以获取标志,但该变量应该在脚本中可用。你是如何在 Torque 上做到这一点的?
  • @WalterA:您的解决方案在touch 的情况下有效,也就是说,我通过sbatch 传递的参数被脚本正确读取为$1。但是,在-o-e 的情况下,$1 似乎是由sbatch 逐字解析的,因此我最终会在磁盘上得到诸如outFile${1}.txt 之类的文件。 @CarlesFenoy:我相信您所说的是正确的,因为 SLURM 会预处理文件以获取 -o-e 标志(也请参阅上面我对 @WalterA 的回复)。在 Torque 中,您可以执行类似 qsub -D 'pwd' -v var=1 script.sh$var 之类的操作,在 script.sh 中的值为 1。
  • 我还应该提一下,我以艰难的方式解决了我的问题,也就是说,使用“主脚本”创建了一堆脚本,这些脚本简单地回显了许多内容行以反映所有不同的命令行我想传递给单个脚本的参数,然后通过sbatch 将它们全部提交到我的批处理服务器。但是,这并不能回答手头的问题,所以我犹豫将其添加为我自己对原始问题的回答。我还将在原始帖子中进行编辑以反映这一点。

标签: bash shell unix slurm


【解决方案1】:

我想我会提供一些见解,因为我也在寻找qsub-v 选项的替代品,对于sbatch,可以使用--export 选项来完成。我找到了一个nice site here,它显示了从 Torque 到 Slurm 的转换列表,它使转换更加更顺畅。

您可以在 bash 脚本中提前指定环境变量:

$ var_name='1'
$ sbatch -D `pwd` exampleJob.sh --export=var_name

或者直接在sbatch 命令中定义它,就像qsub 允许的那样:

$ sbatch -D `pwd` exampleJob.sh --export=var_name='1'

这是否适用于exampleJob.sh# 预处理器也是另一个问题,但我认为它应该提供与 Torque 中相同的功能。

【讨论】:

  • 为了节省其他人的故障排除,--export=var_name 对我不起作用,我不得不使用 --export=var_name='1'. Also, I had to put --export=var_name="1"`在我的脚本路径之前;它没有按照这个答案的安排工作。
  • 这对我有用:sbatch -D `pwd` --export=var_name=$var_name exampleJob.sh
  • 对我有用的是sbatch --export=ALL,var_name='1' exampleJob.sh 没有ALL SLURM 会创建一个与用户环境分开的新环境。
  • @Josh 感谢您在脚本路径为我工作之前放置标志!
【解决方案2】:

使用包装器更方便。我从this thread 找到了这个解决方案。

基本上,问题在于 SBATCH 指令被 shell 视为 cmets,因此您不能在其中使用传递的参数。相反,您可以在相应地设置参数后使用此处的文档来输入您的 bash 脚本。

如果您有问题,您可以用以下代码替换 shell 脚本文件:

#!/bin/bash
sbatch <<EOT
#!/bin/bash

#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"

hostname

exit 0
EOT

然后你像这样运行 shell 脚本:

bash [script_name].sh [suffix]

并且输出将被保存到 outFile[suffix].txt 和 errFile[suffix].txt

【讨论】:

  • 这是正确答案。只需添加上面的前两行和最后的“EOT”。您甚至可以使用sbatch 而不是bash 继续提交您的脚本。
  • 非常适合我
【解决方案3】:

如果您通过命令行传递命令,您实际上可以绕过无法在批处理脚本中传递命令行参数的问题。例如,在命令行:

var1="my_error_file.txt"
var2="my_output_file.txt"
sbatch --error=$var1 --output=$var2 batch_script.sh

【讨论】:

    【解决方案4】:

    以#SBATCH 开头的行不被 bash 解释,而是被 sbatch 替换为代码。 sbatch 选项不支持 $1 变量(仅 %j 和其他一些,将 $1 替换为 %1 将不起作用)。 当您没有并行运行不同的 sbatch 进程时,您可以尝试

    #!/bin/bash
    
    touch outFile${1}.txt errFile${1}.txt
    rm link_out.sbatch link_err.sbatch 2>/dev/null # remove links from previous runs
    ln -s outFile${1}.txt link_out.sbatch
    ln -s errFile${1}.txt link_err.sbatch
    
    #SBATCH -o link_out.sbatch
    #SBATCH -e link_err.sbatch
    
    hostname
    # I do not know about the background processing of sbatch, are the jobs still running
    # at this point? When they are, you can not delete the temporary symlinks yet.
    
    exit 0
    

    替代方案: 正如您自己在评论中所说,您可以制作一个主脚本。 这个脚本可以包含像

    这样的行
    cat  exampleJob.sh.template | sed -e 's/File.txt/File'$1'.txt/' > exampleJob.sh
    # I do not know, is the following needed with sbatch?
    chmod +x exampleJob.sh
    

    在您的模板中,#SBATCH 行看起来像

    #SBATCH -o "outFile.txt"
    #SBATCH -e "errFile.txt"
    

    【讨论】:

    • 谢谢!本质上,此解决方案允许 sbatch 的代码对软链接进行操作,但链接本身指向由可以正确解析命令行参数的 shell 脚本部分创建的实际文件。我会接受这个作为我的答案。
    • 这不起作用,因为#SBATCH 参数必须出现before any other command otherwise they are ignored
    • @damienfrancois 你可能是对的,我实际上并没有用 Slurm 尝试过。我查看了您的链接,我认为我的脚本应该分成 Slurm 使用的一部分(只有 #SBATCH 行)和一个调用 Slurm 的主脚本。那个masterscript应该从他的孩子身上分离出来,不知道什么时候清理临时链接。所以我猜我给出的替代解决方案(带有模板)效果更好。您知道是否可以将 Shell 变量放入 &lt;filename pattern&gt; 中吗? --output=File${some_var}.out--output=File${myshell.sh}.out 之类的东西?
    • 仅当您通过标准输入将提交脚本传递给 sbatch 而不是将其作为参数提供时。
    【解决方案5】:

    这样的东西对我和 Torque 有用

    echo "$(pwd)/slurm.qsub 1" | qsub -S /bin/bash -N Slurm-TEST
    slurm.qsub:
    
    #!/bin/bash
    hostname > outFile${1}.txt 2>errFile${1}.txt
    exit 0
    

    【讨论】:

      【解决方案6】:

      这是一个老问题,但我只是偶然发现了同样的任务,我认为这个解决方案更简单:

      假设我在 bash 脚本 launch_analysis.bash 中有变量 $OUT_PATH,我想将此变量传递给 task_0_generate_features.sl,这是我的 SLURM 文件,用于将计算发送到批处理服务器。我将在launch_analysis.bash 中有以下内容:

      `sbatch --export=OUT_PATH=$OUT_PATH task_0_generate_features.sl`
      

      task_0_generate_features.sl可以直接访问

      在@Jason 的情况下,我们会:

      sbatch -D `pwd` --export=hostname=$hostname exampleJob.sh
      

      参考:Using Variables in SLURM Jobs

      【讨论】:

        猜你喜欢
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2021-11-29
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多