bash - sge 获取脚本中的脚本位置

标签 bash cluster-computing

我正在编写要在 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
BaseDir 0:/opt/gridengine/default/spool/compute-2-8/job_scripts/9534
SGE_ROOT:/opt/gridengine
SGE_JOB_SPOOL_DIR:/opt/gridengine/default/spool/compute-2-8/active_jobs/9534.1

主要问题是 sge 实现将我的脚本复制到 job_script 中,因此我丢失了对原始脚本的引用。

最佳答案

我的猜测是 qsub 将提交存储在一个单独的目录中,然后从那里运行它。到那时,原始队列条目的路径将丢失。如果您需要将其包含在作业的元数据中,您只需将其作为参数传递即可。

通常不保证提交目录对运行作业的节点可见,因此您尝试的操作可能无法直接实现。

根据平台的不同,您可能必须创建某种独立的 bundle ,或者以某种方式在计算节点上引入您需要的依赖项,作为作业启动处理的一部分。

关于bash - sge 获取脚本中的脚本位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37721931/

相关文章:

将单词附加到文件名的 bash 脚本

linux - `!:-` 是做什么的?

带有 https 的 Node.js 集群

cloud - 隔间云计算

node.js - NodeJS|集群 : How to send data from master to all or single child/workers?

使用 VPA 的 Kubernetes 自动缩放 - 关闭还是自动更新模式?

hadoop - MapReduce 连续执行

linux - 如果远程服务器上不存在文件或磁盘已满,则从子 shell 退出 shell 脚本?

python - 用于在文件夹中查找文件的 Bash 脚本

c - 在c中与ncurses异步运行bash命令