是否有 "one-liner" 用于向 SLURM(类似于 LSF)提交许多作业?
Is there a "one-liner" for submitting many jobs to SLURM (similar to LSF)?
我可以 "one-liners" 提交给 SLURM 吗?
使用 LSF 的 bsub
和标准 Linux 实用程序 xargs
,我可以轻松提交一个单独的作业来解压缩目录中的所有文件:
ls *.gz | sed 's/.gz$//g' | xargs -I {} bsub 'gunzip -c {}.gz > {}'
使用 SLURM,我认为 srun
或 sbatch
会起作用,但无济于事:
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
我已经看到 bsub
从 LSF listed as equivalent 到 sbatch
来自 SLURM,但到目前为止,它们似乎只等同于提交脚本文件:
SLURM LSF
-------------------- ------------------
Job Submission sbatch [script_file] bsub [script_file]
是否有任何其他方式可以使用 SLURM 提交 "one-liner" 作业?
尝试使用 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.
基于 , I created a utility called 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 等选项
您也可以通过管道输入 sbatch
。这是一个例子
echo '#!/bin/bash
touch hello_slurm.txt
' | sbatch -e err.log -o out.log
这可以 "forced" 成一行并且与 xargs -n1
一起工作也很好,但我认为这种方式更易读,可以说明这个想法。
我个人更喜欢这里的 heredoc
,因为如果嵌入的 "one-liner" 或 "some-liner" 也包含单引号,它会增加一些灵活性(恕我直言,这也是一个更通用的解决方案与 sbatch --wrap
相比):
sbatch -e err.log -o out.log <<"EOF"
#!/bin/bash
touch 'hello_slurm2.txt'
EOF
顺便说一句,因为问题中也提到了它:使用 LSF 时,同样的方法适用于 bsub
。
我可以 "one-liners" 提交给 SLURM 吗?
使用 LSF 的 bsub
和标准 Linux 实用程序 xargs
,我可以轻松提交一个单独的作业来解压缩目录中的所有文件:
ls *.gz | sed 's/.gz$//g' | xargs -I {} bsub 'gunzip -c {}.gz > {}'
使用 SLURM,我认为 srun
或 sbatch
会起作用,但无济于事:
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
我已经看到 bsub
从 LSF listed as equivalent 到 sbatch
来自 SLURM,但到目前为止,它们似乎只等同于提交脚本文件:
SLURM LSF
-------------------- ------------------
Job Submission sbatch [script_file] bsub [script_file]
是否有任何其他方式可以使用 SLURM 提交 "one-liner" 作业?
尝试使用 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.
基于
此脚本将作业名称和您的命令放在引号中,然后为您创建脚本(运行为您创建)。
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 等选项
您也可以通过管道输入 sbatch
。这是一个例子
echo '#!/bin/bash
touch hello_slurm.txt
' | sbatch -e err.log -o out.log
这可以 "forced" 成一行并且与 xargs -n1
一起工作也很好,但我认为这种方式更易读,可以说明这个想法。
我个人更喜欢这里的 heredoc
,因为如果嵌入的 "one-liner" 或 "some-liner" 也包含单引号,它会增加一些灵活性(恕我直言,这也是一个更通用的解决方案与 sbatch --wrap
相比):
sbatch -e err.log -o out.log <<"EOF"
#!/bin/bash
touch 'hello_slurm2.txt'
EOF
顺便说一句,因为问题中也提到了它:使用 LSF 时,同样的方法适用于 bsub
。