【问题标题】:run job script with different variables found in other files使用在其他文件中找到的不同变量运行作业脚本
【发布时间】:2025-12-20 21:10:10
【问题描述】:

假设我在 txt 文件 (var.txt) 中有以下变量列表:

AAA
ABC
BBB
CCC

以下 R 脚本 (script.R),其中 x 是 var.txt 中的一个变量:

print(x)

以及以下 HPC slurm 作业脚本 (job.sh):

#!/bin/bash
#SBATCH --job-name test
#SBATCH --ntasks 8
#SBATCH --time 04:00
#SBATCH --output out
#SBATCH --error err

Rscript script.R

如何依次运行 job.sh 脚本 4 次,每次在 script.R 中使用不同的变量?

预期输出: 4 个带有脚本的 slurm 作业。R 打印 AAA、ABC、BBB 和 CCC。

感谢您的帮助

【问题讨论】:

  • 我不知道 R,但假设它允许您在命令行上传递参数,例如 while read -r var; do Rscript script.R --variable="$var"; done <var.txt 或更简洁的 xargs -i -n 1 Rscript script.R --variable={} <var.txt
  • 谢谢,我认为这回答了一半的问题。最后一件事是我需要启动 4 个 job.sh,每个都有不同的 var
  • 所以你不希望它们按顺序排列吗?对slurm 也不太熟悉,但您可以创建四个单独的临时文件,或者更理想的是让它从标准输入中读取您提交的内容。

标签: bash slurm hpc script


【解决方案1】:

这是适合job array 的典型工作负载。使用这样的提交脚本

#!/bin/bash
#SBATCH --job-name test
#SBATCH --ntasks 8
#SBATCH --time 04:00
#SBATCH --output out
#SBATCH --error err
#SBATCH --array=0-3

readarray -t VARS < var.txt
VAR=${VARS[$SLURM_ARRAY_TASK_ID]}
export VAR

Rscript script.R

script.R

print(Sys.getenv("VAR"))

您将获得一个包含四个作业的作业数组,每个作业都运行 R 脚本,具有不同的 env var VAR 值,取自 var.txt 文件。

【讨论】:

  • 谢谢,这似乎是正确的方法。我正在尝试使用我的真实脚本运行它,但它不起作用。在我的真实情况下,“VAR”在 R 函数中,如下所示:r_function(input.files= paste("beginning_file_", Sys.getenv("VAR"), "_end_file.nc", sep=""))。但这不起作用。有什么建议吗?
  • 对我来说很难,除非你更明确地说“不工作”。您是否面临错误消息?如果是这样,它说明了什么?
  • 如果我在上面运行您的建议,我会得到以下输出(例如上次运行): "CCC\n" 。所以不知何故,似乎没有正确读取 var.txt,因为当我打印 VAR 时,我得到“\n”附加到 VAR :(
  • 你能试试这个新版本吗(-t