Slurm sbatch将stdout和stderr定向到由-o和-e标志指定的文件,但如果文件路径包含不存在的目录,则无法这样做。是否有办法自动生成我的日志文件的目录?
我找到这样做的唯一方法是将对sbatch的调用封装在bash脚本中,这些脚本的长度比如此小的脚本所需的时间长很多倍。我在下面列出了一个简短的例子。
#!/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等)之间将是相似的,因此会造成大量的代码重复。情不自禁地认为一定有更好的办法。
发布于 2019-02-01 21:07:38
您可以在提交脚本中自己重定向Python脚本的输出,或者选择放弃Slurm日志,或者将关于该作业的有趣信息写入Slurm日志,以便进行源跟踪和再现。
您可以让提交脚本像这样运行:
#!/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。
https://stackoverflow.com/questions/54370203
复制相似问题