【问题标题】:Using sbatch to write to file使用 sbatch 写入文件
【发布时间】:2020-06-24 19:02:10
【问题描述】:

我是 slurm 的新手,我正在尝试批处理 shell 脚本以写入文本文件。我的 shell 脚本(标题为“troublesome.sh”)如下所示:

#!/bin/bash
#SBATCH -N 1
#SBATCH -n 1

echo "It worked!"

当我运行sh troublesome.sh > doeswork.txt 时,它会写下“它成功了!”按预期到doswork.txt。但是,当我运行sbatch troublesome.sh > doesnotwork.txt 时,生成的文件只包含“提交的批处理作业 3027448”。我之前已经成功地将 sbatch 用于更复杂的命令,但我完全困惑为什么这个简单的 shell 脚本不起作用。

关于我做错了什么有什么想法吗?非常感谢!

【问题讨论】:

    标签: pipe slurm


    【解决方案1】:

    要在文件中获取输出,请将>> output_file 添加到sbatch 脚本内的命令(此处为echo "it worked")。因为,sbatch里面的命令在所有节点上执行,写入stdoutsbatch 命令只是将作业提交给控制器,并且仅将有关作业提交的输出返回给登录节点。

    #!/bin/bash
    #SBATCH -N 1
    #SBATCH -n 1
    
    echo "It worked!" >> output_file
    

    为什么会这样?

    sbatch 在脚本成功传输到 Slurm 控制器并分配 Slurm 作业 ID 后立即退出。因此,它是命令sbatch some_script.sh >> somefile.txt 的唯一输出。这就是为什么您只会获得有关向控制器提交作业的信息。

    批处理脚本不一定会立即获得资源,它可能会在等待的作业队列中等待一段时间,然后才能获得所需的资源。

    正如 damienfrancois 的回答,文件是在作业开始时创建的。默认情况下,标准输出和标准错误都指向名为“slurm-%j.out”的文件,其中“%j”被替换为作业分配号。该文件将在作业分配的第一个节点上生成。除了批处理脚本本身,Slurm 不会移动用户文件。

    当最终为批处理脚本授予作业分配时,Slurm 在分配的节点集中的第一个节点上运行批处理脚本的单个副本。

    【讨论】:

    • 非常感谢您,j23!这是一个很好的解释!
    【解决方案2】:

    sbatch 命令仅输出分配给提交的作业的 ID。提交脚本的输出被写入由--output=<filename pattern>--error=<filename pattern> 参数指定的文件(参见sbatch manpage

    文件在作业开始后创建。默认命名为

    “slurm-%j.out”,其中“%j”替换为作业 ID

    因此,在您运行包含"It worked!" 字符串的sbatch 命令的目录中应该有一个slurm-3027448.out 文件。

    您当然可以按您想要的方式命名该文件。如果文件名不包含作业 ID,它将在作业开始时被截断(清空),除非您使用 --open-mode=append 参数,在这种情况下,新内容将附加到文件中。

    附加而不是覆盖的另一个选项是在提交脚本的开头附近添加此行:

    exec >> doeswork.txt
    

    这会将所有输出重定向到doeswork.txt 文件,就好像脚本中的所有命令都跟在>> doeswork.txt 之后一样。

    【讨论】:

    • 非常感谢!有没有一种好方法可以将输出重定向到目标文件(此处为 doesnotwork.txt)而不是创建单独的输出文件?在这个例子中,我试图覆盖一个令人兴奋的文件,但我最终想添加 >> 符号。
    • 我更新了关于追加而不是覆盖的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2019-03-25
    • 2012-06-07
    • 2021-05-29
    • 2011-05-20
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多