如何将输入通过管道传输到 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
我有一个名为 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