如何将PBS脚本的输出与错误文件以当前时间命名保存?
解决PBS脚本输出/错误文件以时间戳命名的问题
问题根源:PBS调度器不会解析#PBS指令中的shell命令(如$(date)),只会将其当作文件名的一部分,因此直接写在#PBS -o/-e中会原样输出。
方案1:在脚本主体中重定向输出(推荐)
修改脚本,在bash执行逻辑中生成时间戳,通过exec重定向所有输出和错误:
#!/bin/bash #PBS -l select=1:ncpus=2:mem=1GB,walltime=00:02:00 #PBS -N PBS_test #PBS -V #PBS -q Hercules #PBS -v CONTAINER_IMAGE=docker_img # 生成时间戳并定义输出目录 TIMESTAMP=$(date +%Y%m%d_%H%M%S) OUTPUT_DIR="path_to_dir" # 确保输出目录存在(可选,防止目录不存在导致写入失败) mkdir -p "${OUTPUT_DIR}" # 重定向标准输出和错误到对应文件 exec > "${OUTPUT_DIR}/output_${TIMESTAMP}.log" 2> "${OUTPUT_DIR}/error_${TIMESTAMP}.log" # 后续作业命令示例 echo "作业开始执行" # rest of your commands
脚本执行时,$(date)会被bash正确解析为当前时间戳,输出和错误会写入目标格式的文件。
方案2:提交作业时通过命令行指定输出文件
若不想修改脚本,可在qsub提交时直接指定带时间戳的路径,此时shell会先解析$(date)再传递给调度器:
qsub -o "path_to_dir/output_$(date +%Y%m%d_%H%M%S).log" -e "path_to_dir/error_$(date +%Y%m%d_%H%M%S).log" your_script.sh
注意:此方式的时间戳是作业提交时间,若作业需要排队,会和实际启动时间存在偏差。
方案3:使用PBS作业启动时间(更准确)
若需记录作业实际启动的时间,可利用PBS提供的PBS_JOBSTARTTIME环境变量,转换为目标格式:
#!/bin/bash #PBS -l select=1:ncpus=2:mem=1GB,walltime=00:02:00 #PBS -N PBS_test #PBS -V #PBS -q Hercules #PBS -v CONTAINER_IMAGE=docker_img # 从PBS_JOBSTARTTIME提取并转换时间戳 TIMESTAMP=$(date -d "${PBS_JOBSTARTTIME}" +%Y%m%d_%H%M%S) OUTPUT_DIR="path_to_dir" mkdir -p "${OUTPUT_DIR}" exec > "${OUTPUT_DIR}/output_${TIMESTAMP}.log" 2> "${OUTPUT_DIR}/error_${TIMESTAMP}.log" # 后续作业命令...
此方式的时间戳是作业被调度器实际启动的时间,更贴合作业执行的真实节点。
内容的提问来源于stack exchange,提问作者Hrishikesh Satarkar
相关产品推荐
相关产品推荐

