我在使用SGE的Rocks群集上运行了一些遗留的科学代码。我有一个特定于应用程序的作业提交脚本,可以生成qsub脚本(即Sun Grid Engine采用并运行的脚本)。
在qsub脚本中,我的旧应用程序被调用。这个应用程序将其输出发送到STDOUT。 SGE拦截STDOUT并将其假脱机到用户主目录中的文件中,因此用户可以实时查看结果。我希望保持这种行为,但同时,我希望在后台透明地记录所有输出。我认为发球台是完美的。
因此,我修改了作业提交脚本以运行应用程序并将STDOUT管道传输到tee,这会将STDOUT保存到作业完成后复制到中央存储的文件。该应用程序运行并通过管道发送至如下:
\$GMSCOMMAND | tee \$SCRATCHDIR/gamess_output.log
问题是,自从我开始将代码传递给tee之后,应用程序一直在使用SIGTERM,特别是当我请求多个节点时。我尝试在tee中使用-i(忽略中断)参数:它没有任何区别。
如果我将应用程序输出重定向到文件然后在应用程序完成后捕获文件,那么事情就可以了,但是我不能让用户实时查看结果累积(这是一个重要的要求)。 / p>
关于为何使用三通可能会失败的任何想法?或者,关于我如何实现所需功能的任何想法?
答案 0 :(得分:1)
我不知道你的特定情况失败的原因,但一个选项可能是让$GMSCOMMAND
做自己的记录。 (有效地将T恤放入应用程序内)。我想这个选项取决于更改旧版应用程序的成本。
如果你没有用你自己的脚本/应用程序包装“遗留应用程序”来进行重定向/复制,那么就失败了。
答案 1 :(得分:0)
如果管道是你的问题,也许你可以通过使用带有进程替换的'while / read'循环来解决这个问题。这对你有用吗?
while read line; do
echo "$line"
echo "$line" >> ${SCRATCHDIR}/gamess_output.log
done <(${GMSCOMMAND})