用于记录LSF(bsub)作业完成的脚本

时间:2018-01-30 13:41:30

标签: cron heredoc lsf

我有一个cron调用的脚本来运行LSF作业。

我希望在提交作业和完成作业时被告知。 -Powers-That-Be决定禁用电子邮件通知。所以我正在编写此脚本以将相关信息输出到日志文件。

几乎有效。这是一些代码:

的crontab:

00 12 * * * my_script.sh my_job.bsub

my_job.bsub:

#!/bin/bash
#BSUB -q my_queue
#BSUB -W 06:00

echo "I am a long process"
sleep 60

my_script.sh:

#!/bin/sh

BSUB_SCRIPT=$1

# run bsub_script (and get the LSF job id while you're at it)...
JOB_ID=`bsub < $BSUB_SCRIPT | awk -F[\<,\>] '{print $2}'`

# log that job was submitted...                
echo "`date +%Y-%m%d %T` submitted '$BSUB_SCRIPT' [$JOB_ID]" >> $HOME/my_logfile.txt

# and log when job completes...
bsub -w "ended($JOB_ID)" << EOF
#!/bin/bash
#BSUB -q my_queue
#BSUB -W 00:30

echo "`date +%Y-%m-%d %T` completed '$BSUB_SCRIPT' [$JOB_ID]" >> $HOME/my_logfile.txt

EOF

(我发现this answer有助于弄清楚如何提交等待早期工作完成的工作。)

问题是,在heredoc中对date的第二次调用会立即得到的评估,所以最终会得到一个如下所示的日志文件:

my_logfile.txt:

2018-01-30 13:15:14 submitted 'my_job.bsub' [1234567]
2018-01-30 13:15:14 completed 'my_job.bsub' [1234567]

注意时间是如何完全相同的。

如何确保延迟评估heredoc的内容,直到LSF作业运行?

1 个答案:

答案 0 :(得分:1)

heredoc中的date命令在传递给bsub之前正在扩展。您需要在heredoc表达式中引用EOF或转义date命令。看到这个问题的答案: How does "cat << EOF" work in bash?

特别是:

  

here-documents的格式为:

      <<[-]word
              here-document
      delimiter
     

...

     

如果 word 未加引号, here-document 的所有行都是   进行参数扩展,命令替换和算术   扩展

所以,例如当我跑

$ cat << EOF
> echo `date`
> EOF

输出

echo Tue Jan 30 11:57:32 EST 2018

请注意,date命令已展开,这是您脚本中发生的情况。但是,如果我在heredoc中引用分隔符:

$ cat << "EOF"
> echo `date`
> EOF

您可以获得所需的未扩展输出:

echo `date`

同样,转义日期将保留您要扩展的其他变量:

$ cat << EOF
> echo \$(date)
> EOF

输出:

echo $(date)