【问题标题】:How to pipe input to SLURM's sbatch?如何将输入通过管道传输到 SLURM 的 sbatch?
【发布时间】:2021-09-21 15:16:01
【问题描述】:

我有一个名为 testjob.sh 的作业脚本,我将其提交为

sbatch testjob.sh

是否可以将一些输入通过管道传输到脚本?如果我作为一个简单的命令运行,我会这样做

echo 1 2 3 4 | ./testjob.sh

但是,使用 SLURM,我尝试了以下方法,但它不起作用:

echo 1 2 3 4 | sbatch testjob.sh 

我的示例脚本是这样的:

#!/bin/bash
#SBATCH --export=ALL
#SBATCH --job-name=jobname
#SBATCH -e jobname.err
#SBATCH -o jobname.out
#SBATCH -p RM-shared
#SBATCH -n 1
#SBATCH --time=00:05:00

echo "jobscipt"
while read -r input 
do
        echo "from jobscipt $input"
done

和输出:

#this one worked
> echo 1 2 3 4 | ./testjob.sh
jobscipt
from jobscipt 1 2 3 4

#slurm did not take the input
> echo 1 2 3 4 | sbatch testjob.sh
Submitted batch job 3758713
> cat jobname.out
jobscipt

我知道可以通过使用--export 设置环境变量来将参数设置为sbatch,但是我将如何通过管道向它输入输入?管道的解决方法是临时文件,但这并不是特别优雅。

【问题讨论】:

    标签: linux slurm hpc


    【解决方案1】:

    sbatch 在不同的环境(“在后台”)中运行作业,因此您无法将内容通过管道传输到脚本中。

    您可以通过两种方式避免这种情况:

    • 使用srun 而不是sbatch,这不会断开作业与会话的连接,并且管道或多或少地正常工作。不过,这不允许您像批处理一样“排队”作业。
    • 使用中间文件保存输入,即修改批处理文件以从testjob.in读取输入:
    while read -r input
    do
       ...
    done < testjob.in
    

    并在将批处理排入队列之前将您的输入放入中间文件:

    echo 1 2 3 4 > testjob.in
    sbatch testjob.sh
    

    【讨论】:

      猜你喜欢
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多