我使用 Sun 的 SGE 将我的作业提交到集群系统中。问题是如何让计算机在主机中查找环境变量,或者如何配置qsub
脚本以使计算机在主机中加载环境变量?下面是一个脚本示例,但它会说一些错误,例如找不到库:
#!/bin/bash
#
#$ -V
#$ -cwd
#$ -j y
#$ -o /home/user/jobs_log/$JOB_ID.out
#$ -e /home/user/jobs_log/$JOB_ID.err
#$ -S /bin/bash
#
echo "Starting job: $SGE_TASK_ID"
# Modify this to use the path to matlab for your system
/home/user/Matlab/bin/matlab -nojvm -nodisplay -r matlab_job
echo "Done with job: $SGE_TASK_ID"
您正在使用的技术(添加 -V)应该有效。 由于您使用 -S 指定 shell,因此的一种可能性是网格引擎配置为启动/bin/bash 作为登录 shell,并且您的配置文件脚本在您尝试传递给作业的环境中到处都是。
尝试在作业排队/运行时对作业使用 qstat -xml -j
,以查看网格引擎尝试传递给作业的环境变量。
尝试向脚本添加 env
命令以查看设置了哪些变量。
尝试在脚本中添加shopt -q login_shell;echo $?
以告诉您它是否作为登录 shell 运行。
要列出在网格引擎中配置为登录外壳的外壳,请尝试:
SGE_SINGLE_LINE=true qconf -sconf|grep ^login_shells
我认为这个问题是由于您没有在 SGE login_shells中配置 BASH。通过qconf -sconf
检查您的login_shells,看看是否在那里。
login_shells UNIX 命令解释器,如 Bourne-Shell(参见 sh(1))或 C- Shell (参见 csh(1)) 可以被网格引擎用来启动作业脚本。这 命令解释器可以作为登录外壳启动(即 都 系统和用户默认资源文件(如 .login 或 .profile)将是 在命令解释器启动和环境时执行 对于作业将设置为用户刚刚登录)或只是 用于命令执行(即仅 shell 特定的资源文件,如 将执行.cshrc,并设置一个最小的默认环境 网格引擎 - 参见 qsub(1))。 参数login_shells包含一个 命令的可执行名称的逗号分隔列表 要作为登录 shell 启动的预处理器。 此列表中的外壳仅是 如果参数shell_start_mode,则作为登录 shell 启动(见上文) 设置为posix_compliant。
Changes to login_shells will take immediate effect. The default for
login_shells is sh,csh,tcsh,ksh.
This value is a global configuration parameter only. It cannot be over-
written by the execution host local configuration.