PBS集群提交多任务时如何将JobID传递给Matlab非函数脚本
解决方案
问题根源
你之前的配置存在两个核心错误:
- Python提交脚本中误用
qsub -F参数传递变量,-F是向PBS脚本传递位置参数的选项,不会自动生成环境变量,导致PBS脚本中无法读取${JOBID} - Python原代码存在语法错误,for循环末尾缺少冒号
步骤1:修改Python提交脚本
修正后的代码如下:
#!/bin/env python import csv, subprocess for i in range(1,3): # 使用qsub的-v参数传递环境变量,直接向PBS作业注入JOBID变量 qsub_cmd = """qsub -v JOBID={jobid} submit_m3.pbs""".format(jobid=i) print(qsub_cmd) exit_code = subprocess.call(qsub_cmd, shell=True)
步骤2:修改PBS执行脚本
修正后的代码如下:
#!/bin/bash #PBS -l nodes=1:ppn=8 #PBS -l walltime=48:00:00 #PBS -l pmem=10gb #PBS -A open # 加载依赖 module purge module load matlab cd ~/code # 双引号会自动展开bash中的JOBID变量,同时日志名增加JOBID避免多任务覆盖 matlab -nodisplay -nosplash -nodesktop -r "job_id=${JOBID};run('myScript.m');exit;" > log.myLog.${JOBID} 2>&1
步骤3:验证Matlab变量接收
在你的myScript.m文件最开头加入以下代码,任务完成后查看对应编号的日志文件,确认变量传递成功:
disp(['成功接收JOBID: ', num2str(job_id)])
内容的提问来源于stack exchange,提问作者esos
相关产品推荐
相关产品推荐

