SGE环境下通过bash脚本参数设置qsub提交作业的自定义名称
问题原因
SGE 中以#$为前缀的作业配置指令,是由qsub命令在提交作业阶段直接读取解析的,执行顺序早于 Bash 对脚本内部变量的解析,因此你写在脚本中的#$ -N $1里的$1不会被替换为传入的参数,会被直接当做作业名写入队列。
解决方案
方法1:提交时通过qsub参数直接指定作业名
删除原提交脚本send_to_sge.sh中#$ -N $1这一行,提交作业时直接通过-N参数传入作业名:
qsub -N foo send_to_sge.sh foo
如果不想每次重复输入文件名,可以额外封装一层通用提交脚本,比如命名为generic_sge_submit.sh:
#!/bin/bash # 通用SGE提交脚本用法:./generic_sge_submit.sh <待运行的Python文件名> if [ $# -lt 1 ];then echo "缺少参数:请指定要运行的Python文件路径" exit 1 fi # 自动取文件名作为作业名,兼容带路径的输入比如./src/bar.py job_name=$(basename "$1") qsub -N "$job_name" send_to_sge.sh "$1"
调整后的send_to_sge.sh内容如下:
#!/bin/bash #$ -cwd #$ -S /bin/bash python -u "$1" >/output_dir/"$1".out 2>/error_dir/"$1".error
方法2:通过Here Document动态生成提交脚本
不用单独维护静态的提交脚本,直接在通用提交脚本中动态生成带正确作业名的提交内容,使用更便捷:
#!/bin/bash # 通用SGE提交脚本用法:./sge_submit.sh <待运行的Python文件名> if [ $# -lt 1 ];then echo "缺少参数:请指定要运行的Python文件路径" exit 1 fi job_file="$1" job_name=$(basename "$job_file") # 动态生成提交内容传给qsub,变量会在提交前完成替换 qsub << EOF #!/bin/bash #$ -cwd #$ -S /bin/bash #$ -N ${job_name} python -u ${job_file} >/output_dir/${job_name}.out 2>/error_dir/${job_name}.error EOF
使用时直接执行./sge_submit.sh foo即可,作业名会自动设为foo,输出和错误日志也会对应生成。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

