如何将输入通过管道传输到 SLURM 的 sbatch?

How to pipe input to SLURM's sbatch?

我有一个名为 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,但我如何通过管道将输入传递给它?管道的解决方法是一个临时文件,但这不是特别优雅。

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

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

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

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

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