我有一个R脚本,它运行多个文件,比如file=1到50。我通常提交重复的工作,例如5次,每次10个文件,通过改变R-脚本中的数字。那么,我怎样才能一次提交5份工作而不提交5次呢?此外,我希望更新每个作业的<>default.out和错误文件。
示例bash代码:
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
#PBS -o default.out
#PBS -e errorfile
module load R/4.0
Rscript ~/r_script1.R发布于 2021-05-23 02:55:53
您可以在qsub命令行中指定任何或所有这些选项,而不是将其指定为脚本中的#PBS ...注释。
例如,您的批处理脚本可以重写为:
qsub -l nodes=1:ppn=20,walltime=05:00:00 -m e -o default.out -e errorfile script.sh对于qsub命令行上的所有选项,script.sh只需包含:
#!/bin/bash
module load R/4.0
Rscript ~/r_script1.R您可以混合向qsub提供选项的两种方法。例如,您可以在命令行上提供-o和-e选项,脚本中的其余部分作为#PBS注释:
$ qsub -o default.out -e errorfile script2.shscript2.sh:
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
module load R/4.0
Rscript ~/r_script1.R然后,您可以将其与bash for循环结合起来:
for i in {1..5} ; do
qsub -o "default.$i.out" -e "errorfile.$i" script2.sh
done如果您需要将循环变量$i的值传递给脚本,这是可能的--但是有几种不同的实现方法,这取决于您使用的集群管理软件(例如slurm或torque或其他什么)。不管您使用的是哪个版本的qsub,使用qsub的-v选项都是最简单的,也可能是可用的。
例如,如果您需要在每个作业、r_script1.R、r_script2.R等中运行不同的R脚本,则可以使用-v i在脚本的环境中使用$i:
for i in {1..5} ; do
qsub -o "default.$i.out" -e "errorfile.$i" -v i script3.sh
donescript3.sh:
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
module load R/4.0
Rscript ~/r_script"$i".Rqsub的某些实现允许将参数直接在命令行上传递给脚本,然后可以将其用作脚本中的正常位置参数($1、$2、$3等)。
大多数(全部?)qsub的实现还支持指定作业数组的-t选项。这可以在作业脚本中使用PBS_ARRAYID环境变量访问。例如:
qsub script4.shscript4.sh (它使用shell重定向输出和错误文件,而不是qsub的-o和-e选项):
#!/bin/bash
#PBS -l nodes=1:ppn=20,walltime=05:00:00
#PBS -m e
#PBS -t 1-5
module load R/4.0
Rscript ~/r_script"$PBS_ARRAYID".R > "default.$PBS_ARRAYID.out" 2> "errorfile.$PBS_ARRAYID"顺便说一句,PBS_ARRAYID是一个导出的环境变量,如果需要,可以在R脚本中使用Sys.getenv("PBS_ARRAYID")访问。例如,您可以使用它来构造输入和输出文件名,以及用于if/then/else决策来控制R脚本的操作。这将比拥有多个稍微不同版本的同一个R脚本更好。
注意:虽然我曾经管理运行torque和slurm的HPC集群,但从我这样做到现在已经有8年了。以上所有示例都是从内存(以及在internet上搜索qsub手册页)编写的,并且没有在实际的集群上进行测试。它们可能(可能会)需要一些更改才能工作,特别是使用$PBS_ARRAYID的最后一个示例--它们是关于如何实现您想做的事情的粗略示例。
https://unix.stackexchange.com/questions/650937
复制相似问题