用于记录 LSF (bsub) 作业完成情况的脚本
script to log the completion of an LSF (bsub) job
我有一个由 cron 调用的脚本,用于 运行 LSF 作业。
我想知道该作业何时提交以及何时完成。 The-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=
# run bsub_script (and get the LSF job id while you're at it)...
JOB_ID=`bsub < $BSUB_SCRIPT | awk -F[\<,\>] '{print }'`
# 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 作业 运行 之后?
heredoc 中的 date
命令在传递给 bsub
之前正在扩展。您需要在 heredoc 表达式中引用 EOF
或转义 date
命令。看到这个问题的答案:
How does "cat << EOF" work in bash?
特别是:
The format of here-documents is:
<<[-]word
here-document
delimiter
...
If word is unquoted, all lines of the here-document are
subjected to parameter expansion, command substitution, and arithmetic
expansion.
所以,例如当我 运行
$ 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)
我有一个由 cron 调用的脚本,用于 运行 LSF 作业。
我想知道该作业何时提交以及何时完成。 The-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=
# run bsub_script (and get the LSF job id while you're at it)...
JOB_ID=`bsub < $BSUB_SCRIPT | awk -F[\<,\>] '{print }'`
# 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 作业 运行 之后?
heredoc 中的 date
命令在传递给 bsub
之前正在扩展。您需要在 heredoc 表达式中引用 EOF
或转义 date
命令。看到这个问题的答案:
How does "cat << EOF" work in bash?
特别是:
The format of here-documents is:
<<[-]word here-document delimiter
...
If word is unquoted, all lines of the here-document are subjected to parameter expansion, command substitution, and arithmetic expansion.
所以,例如当我 运行
$ 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)