5

我正在寻找一些一般性建议,而不是编码解决方案。基本上,当通过 bsub 提交作业时,我可以通过指定以下任何一项来检索 Stdin/Stdout 的日志:

bsub -o log.txt      % sends StdOut to log.txt
bsub -u me@email     % sends StdOut to email

这些都很棒,但是我的程序在提交给 bsub 时会创建一个文件夹并存储在远程服务器上。基本上我想

a) 检索文件夹及其内容 b) 作业完成时自动执行此操作

所以我可以在技术上使用scp -r,但是我必须手动执行此操作。如果我在工作完成后收到电子邮件警报,那还不错,但仍然 - 我必须手动执行此操作。

所以到b):

好吧,我看不到 bsub 检索实际结果的任何特殊标志,只有 StdOut。我我可以有一个使用sleep并设置工作时间的脚本(为了安全起见可能有点逗留),比如

#!/bin/bash

scp myfile.txt server:main/subfolder
ssh bsub < myprogram.sh -u my@email
sleep <job-time>
scp -r server:main/subfolder result_folder 

但是我有点担心被注销等以及脚本在作业完成之前终止。

有没有人有什么建议?

我本质上想要一个界面(将来的网站),用户可以在其中提交文件,远程分析文件,在工作开始/完成时向用户发送电子邮件,结果自动检索回本地/网络服务器,用户收到电子邮件说他们可以选择提高他们的成绩。

不过一步一步!

4

2 回答 2

1

您可以将结果目录 tar 到 stdout到您的日志文件中。然后解压日志文件以检索目录。

tar czf - ...命令添加到脚本的末尾。

如果您首先在 stdout 上出现了其他内容,请将其移至 stderr,或者在 tar 之前回显一些唯一的字符串,对其进行 grep 处理,然后从那里进行 tar。这是对原理的一种测试:

marker='#magic' # some unique string
log=/tmp/b # your logfile
echo 'test' >/tmp/a # just something to tar for this test

# -- in your script, at end --
#  echo "$marker"; tar cf - /tmp/a
# -- equivalent in this test:
(echo 'hello'; echo "$marker"; tar cf - /tmp/a) >$log

# -- to recover the tar --
start=$(grep -ab "$marker" <$log | awk -F: '{print 1+$1+length($2)}')
dd skip=1 bs=$start <$log |
tar tvf - # use tar x really
于 2015-07-13T18:19:05.710 回答
1

您可以在阻塞模式下提交作业 (bsub -K)。这使得bsub命令仅在作业完成或发现错误时返回。

从文档中引用:

-K

提交作业并等待作业完成。提交作业时向终端发送“等待调度”消息。作业完成后向终端发送消息“作业已完成”。如果在 lsf.conf 中启用了 LSB_SUBK_SHOW_EXEC_HOST,当作业开始在执行主机上运行时,也会发送消息“Starting on execution_host”。

在作业完成之前,您无法提交另一份作业。这在需要完成作业才能继续时很有用,例如作业脚本。如果由于暂时失败需要重新运行作业,则 bsub 会在作业成功完成后返回。bsub 以与作业相同的退出代码退出,以便作业脚本可以根据退出代码采取适当的操作。如果作业在挂起时终止,则 bsub 以值 126 退出。

不能将 -K 选项与 -I、-Ip 或 -Is 选项一起使用。

接下来,您可以运行scp或类似的程序来自动从远程主机复制结果,而无需检查您的电子邮件。:)

你也可以在你的包装脚本前面加上nohup以防止它在会话注销时被杀死。

于 2015-10-03T16:48:25.957 回答