我正在编写一个脚本,该脚本将通过sge集群中的qsub运行。
我有几个需要在脚本中调用的可执行文件,它们都在相同的位置(与脚本本身相同)。所以我想知道如何才能得到我正在执行的脚本的位置。我有一个自动构建系统,这只是不正确的硬编码这个位置。代码应该类似于
#!/bin/bash
#$ -S /bin/bash
#$ -V
#$ -cwd
#$ -N "Job"
exec="/path/to/this/script/"execNameJob
$exec我尝试了几件事,但它们都不起作用,人们被标记为重复的。之前的解决方案都不起作用。我正在使用qsub -o console.out /tmp/qsubScript/qsubScript.sh运行我的脚本。我想要得到的是脚本中的/tmp/qsubScript/路径
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
echo " Directory SOURCE: $DIR"
echo " BaseDir 0: " $0
echo " SGE_ROOT: $SGE_ROOT"
echo " SGE_JOB_SPOOL_DIR: $SGE_JOB_SPOOL_DIR"输出为:
目录源: /opt/gridengine/default/spool/compute-2-8/job_scripts
/opt/gridengine/default/spool/compute-2-8/job_scripts/9534 : BaseDir 0
SGE_ROOT: /opt/gridengine
/opt/gridengine/default/spool/compute-2-8/active_jobs/9534.1 :SGE_JOB_SPOOL_DIR
主要问题是sge实现将我的脚本复制到job_script中,因此我丢失了对原始脚本的引用。
发布于 2016-06-10 15:59:23
我的猜测是qsub将提交存储在一个单独的目录中,然后从那里运行它。到那时,原始队列条目的路径将丢失。如果需要将其包含在作业的元数据中,则只需将其作为参数传递即可。
通常不能保证提交目录对运行作业的节点可见,因此您尝试的内容可能无法直接实现。
根据平台的不同,您可能必须创建某种类型的自包含包,或者以某种方式在计算节点上引入所需的依赖项,作为作业启动处理的一部分。
发布于 2016-06-10 23:34:34
不是完全优雅,但问题在一个步骤中就解决了。我使用相同的脚本发送qsub工作并为给定的路径设置一个变量
#!/bin/bash
#
#$ -S /bin/bash
#$ -V
#$ -cwd
#$ -N "Job"
if [ -z ${var+x} ]; then
sPath="`dirname $0`"
qsub -o console.txt -e error.txt -v var=$sPath $0 >qsub.txt
else
echo " Set variable: $var"
fihttps://stackoverflow.com/questions/37721931
复制相似问题