解决LSF作业完成日志中date命令提前执行的问题
解决LSF作业完成时间提前解析的问题
这个问题我太熟悉了——你碰到的核心问题是heredoc的内容被当前shell提前解析了!当你用不带引号的EOF作为heredoc结束标记时,bash会自动对里面的命令替换(比如`date`)、变量展开做处理,所以第二个作业里的date命令在你提交这个等待作业的时候就已经执行了,自然会和提交时间完全一致。
最简单的解决方案:转义命令替换的标记
只需要把heredoc里的date命令替换的反引号(或者$())转义,让当前shell把它当作普通字符串传递给LSF作业,等作业真正运行时再执行date命令。修改你的my_script.sh中第二个bsub的部分:
# 记录作业完成信息... bsub -w "ended($JOB_ID)" << EOF #!/bin/bash #BSUB -q my_queue #BSUB -W 00:30 # 转义date的命令替换标记,避免当前shell提前执行 echo "\`date +%Y-%m-%d %T\` completed '$BSUB_SCRIPT' [$JOB_ID]" >> $HOME/my_logfile.txt EOF
或者你也可以用可读性更好的$()形式,同样转义:
echo "\$(date +%Y-%m-%d %T) completed '$BSUB_SCRIPT' [$JOB_ID]" >> $HOME/my_logfile.txt
原理说明
- 不加转义时,当前shell看到
`date...`会立刻执行date命令,把结果替换进去再提交给LSF; - 加上反斜杠转义后(
\`date...\`),当前shell会保留反引号的原样,把这段代码原封不动地传给LSF的等待作业; - 当原作业完成后,等待作业启动,它的shell会解析这段代码,执行
date命令,得到真正的完成时间。
修改后你的日志就会显示正确的提交时间和完成时间了,比如:
2018-01-30 13:15:14 submitted 'my_job.bsub' [1234567] 2018-01-30 13:16:14 completed 'my_job.bsub' [1234567]
内容的提问来源于stack exchange,提问作者trubliphone
相关产品推荐
相关产品推荐

