有没有"单线"向SLURM提交许多工作(类似于LSF)?

时间:2015-04-22 22:37:57

标签: slurm lsf sbatch

我可以提交" one-liners"去SLURM?

使用LSF中的bsub和标准Linux实用程序xargs,我可以轻松地提交一个单独的作业来解压缩目录中的所有文件:

ls *.gz | sed 's/.gz$//g' | xargs -I {} bsub 'gunzip -c {}.gz > {}'


使用SLURM,我认为srunsbatch可行,但无济于事:

ls *.gz | sed 's/.gz$//g' | xargs -I {}  srun 'gunzip -c {}.gz > {}'
gzip: srun: error: compute-node-01: task 0: Exited with exit code 1
stdin: unexpected end of file

ls *.gz | sed 's/.gz$//g' | xargs -I {}  sbatch 'gunzip -c {}.gz > {}'
sbatch: error: Unable to open file gunzip -c naive_S1_L001_R1_001.fastq.gz > naive_S1_L001_R1_001.fastq

我已经从SLURM看到来自LSF listed as equivalentbsub的{​​{1}},但到目前为止,它们似乎仅等同于提交脚本文件:

sbatch

有没有其他方式可以提交" one-liner" SLURM的工作?

3 个答案:

答案 0 :(得分:8)

尝试使用sbatch的换行选项。如下所示:

ls *.gz | sed 's/.gz$//g' | xargs -I {}  sbatch --wrap="gunzip -c {}.gz > {}"


来自sbatch的手册页:

--wrap=<command string>
       Sbatch will wrap the specified command string in  a  simple  "sh"  shell
       script,  and submit that script to the slurm controller.  When --wrap is
       used, a script name and arguments may not be specified  on  the  command
       line; instead the sbatch-generated wrapper script is used.

答案 1 :(得分:1)

Carles Fenoy's answer的基础上,我创建了一个名为sbatch_run的实用程序。

此脚本在引号中获取作业名称和命令,然后为您创建脚本(并为您运行)。

sbatch_run jobname 'ls -lArt > list_of_files.txt'

将创建以下脚本并为您运行:

#!/bin/env bash
#SBATCH -J jobname.sbatch
#SBATCH -o jobname.sbatch.o_%j
#SBATCH -e jobname.sbatch.e_%j
#SBATCH --partition c14,general,HighMem
#SBATCH --mem 5G
#SBATCH --cpus-per-task 1
#SBATCH --nodes 1
#SBATCH --time 2-0

ls -lArt > list_of_files.txt

可以选择为每个任务设置内存和cpus等。

答案 2 :(得分:1)

您也可以输入sbatch。这是一个例子

echo '#!/bin/bash
touch hello_slurm.txt
' | sbatch -e err.log -o out.log

这可能是'#34;强迫&#34;分为一行,并且与xargs -n1一起运作良好,但我认为用这种方式说明这个想法更具可读性。

我个人更喜欢heredoc,因为如果嵌入式&#34; one-liner&#34;它会增加一些灵活性。或者&#34;某些班轮&#34;也包含单引号(这使得它与sbatch --wrap相比也是一种更通用的解决方案):

sbatch  -e err.log -o out.log <<"EOF"
#!/bin/bash
touch 'hello_slurm2.txt'
EOF

顺便说一句,因为问题中也提到过:使用LSF时,同样的方法适用于bsub