2

我有一些在 Rocks 集群上运行的遗留科学代码,使用 SGE。我有一个特定于应用程序的作业提交脚本,它生成 qsub 脚本(即 Sun Grid Engine 采用并运行的脚本)。

在 qsub 脚本中,我的旧版应用程序被调用。此应用程序将其输出发送到 STDOUT。SGE 截获 STDOUT 并将其假脱机到用户主目录中的一个文件中,因此用户可以实时查看结果。我希望保持这种行为,但同时,我想在后台透明地记录所有输出。我认为 tee 非常适合实现这一目标。

所以我修改了作业提交脚本以运行应用程序并将 STDOUT 传输到 tee,它将 STDOUT 保存到一个文件中,一旦作业完成,该文件就会复制到中央存储中。该应用程序运行并通过管道传输到 tee,如下所示:

\$GMSCOMMAND | tee \$SCRATCHDIR/gamess_output.log

问题是,自从我开始将代码传送到 tee 后,该应用程序一直因 SIGTERM 而死,尤其是当我请求多个节点时。我尝试将 -i(忽略中断)参数与 tee 一起使用:它没有区别。

如果我将应用程序输出重定向到一个文件,然后在应用程序完成后对文件进行 cat 处理,那么一切正常,但是我不能让用户实时查看结果累积(这是一个重要的要求)。

关于为什么使用 tee 可能会失败的任何想法?或者,关于我如何实现所需功能的任何想法?

4

2 回答 2

1

我不知道您的特定案例为何失败,但一种选择可能是$GMSCOMMAND自己进行日志记录。(有效地将 T 恤放入应用程序中)。我猜这个选项取决于更改旧版应用程序的成本。

如果您无法使用自己的脚本/应用程序包装“旧版应用程序”来进行重定向/复制。

于 2009-11-23T11:01:18.650 回答
0

如果管道是您的问题,也许您可​​以通过使用带有进程替换的“while/read”循环来解决这个问题。这对你有用吗?

while read line; do
    echo "$line"
    echo "$line" >> ${SCRATCHDIR}/gamess_output.log
done <(${GMSCOMMAND})
于 2009-12-16T11:20:49.877 回答