首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用slurm sbatch之前为日志文件创建目录

在调用slurm sbatch之前为日志文件创建目录
EN

Stack Overflow用户
提问于 2019-01-25 17:32:58
回答 1查看 5.3K关注 0票数 9

Slurm sbatch将stdout和stderr定向到由-o-e标志指定的文件,但如果文件路径包含不存在的目录,则无法这样做。是否有办法自动生成我的日志文件的目录?

  • 每次手动创建这些目录都是效率低下的,因为我正在运行每一批处理提交数十次。
  • 让作业名称的变化存在于文件名中,而不是目录中,这会造成大量的、组织不良的日志,当我需要检查我的作业做得如何时,我必须对其进行排序。

我找到这样做的唯一方法是将对sbatch的调用封装在bash脚本中,这些脚本的长度比如此小的脚本所需的时间长很多倍。我在下面列出了一个简短的例子。

代码语言:javascript
复制
#!/bin/bash
# Set up and run job array for my_script.py, which takes as positional
# arguments a config file (passed via $1) and an array index.

#SBATCH --array=1-100
#SBATCH -n 1
#SBATCH -t 12:00:00
#SBATCH -p short
#SBATCH -J sim_sumstats
#SBATCH --mem=1600

# Initialize variables used for script control flow
sub_or_main='sub'

# Parse options
while getopts ":A" opt; do
    case $opt in
        A)
            sub_or_main='main'
            ;;
        \?)
            # Capture invalid options
            echo "Invalid option: -$OPTARG" >&2
            exit 1
            ;;
    esac
done

shift $((OPTIND - 1))

# Either run the submit script or the main array
if [ $sub_or_main == 'sub' ]; then
    # Submit script creates folders for log files, then calls sbatch on this
    # script in main mode.
    now=$(date +"%y%m%d-%H%M")
    name=$(basename $1 .json)
    logpath="log/my_script_name/$name/$now"
    mkdir -p $logpath
    sbatch \
        -o $logpath/%a.out \
        -e $logpath/%a.out \
        $0 -A $1
else
    # Main loop. Just calls my_script.py with the array ID.
    python ./my_script.py $1 ${SLURM_ARRAY_TASK_ID}
fi

拥有这样一个脚本是可行的,但是看起来非常浪费:我已经将我的sbatch提交脚本的长度增加了一倍多,这只是为了组织我的日志文件。此外,其中大部分是添加的代码,这些代码在其他作业的批提交脚本(例如调用my_script2.py等)之间将是相似的,因此会造成大量的代码重复。情不自禁地认为一定有更好的办法。

EN

回答 1

Stack Overflow用户

发布于 2019-02-01 21:07:38

您可以在提交脚本中自己重定向Python脚本的输出,或者选择放弃Slurm日志,或者将关于该作业的有趣信息写入Slurm日志,以便进行源跟踪和再现。

您可以让提交脚本像这样运行:

代码语言:javascript
复制
#!/bin/bash
# Set up and run job array for my_script.py, which takes as positional
# arguments a config file (passed via $1) and an array index.

#SBATCH --array=1-100
#SBATCH -n 1
#SBATCH -t 12:00:00
#SBATCH -p short
#SBATCH -J sim_sumstats
#SBATCH --mem=1600

now=$(date +"%y%m%d-%H%M")
name=$(basename $1 .json)
logpath="log/my_script_name/$name/$now"
mkdir -p $logpath
logfile="$logpath/${SLURM_ARRAY_TASK_ID}.out"

echo "Writing to ${logfile}"
scontrol show -dd job $SLURM_JOB_ID
printenv

python ./my_script.py $1 ${SLURM_ARRAY_TASK_ID} > ${logfile}

这样,Python脚本的输出就会出现在您想要的地方,并且在创建日志文件之前将创建父目录。

此外,您将拥有Slurm创建的标准输出文件,其中包含默认的命名方案,包含有关作业的信息(来自scontrol)和来自环境的信息(使用printenv)。

但是,如果要阻止Slurm尝试创建输出文件,请设置--output=/dev/null

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54370203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档