我是一名在 AIX 上使用 DB2 的数据库管理员。 (请继续阅读,因为这与 ksh 相关而不是与 DB2 相关,否则我会将其发布在dba.stackexchange.com.) 我正在尝试为我们的几个数据库部署以及数据库维护脚本编写 ksh 脚本。
我正在将错误处理放入脚本中,以了解某些内容是否需要硬失败或仅需要警告消息,或者可以被忽略。
对于大多数 AIX/ksh 相关任务,我可以检查$? = 0
,但对于 DB2 则不然。除非数据库引擎发生故障,否则我将永远不会得到除了零之外的任何东西。然而,DB2 会将其错误/警告/信息代码传回控制台。
因为我知道我可以通过控制台获取这些代码,所以我一直在尝试捕获控制台上的任何内容以获取 DB2 的特定命令。一旦我有了这个,我就会将该输出发送到一个函数,在该函数中我使用正则表达式来确定我的脚本中egrep
是否需要失败(exit 1
)或成功( )。exit 0
我还倾向于将脚本的所有输出通过管道传输到tee
,因为我的几个脚本很长并且/或调用多个其他脚本。这样我就可以记录运行的整个“作业”,以供参考以及对脚本进行故障排除。
最近,我了解到我可以ksh blah.sh 2 > &1 | tee mylog
确保捕获脚本中的语法错误。
我想知道,在 ksh 中处理这种错误解析的最佳方法是什么?我尝试使用 -v 选项向 DB2 提供命令(应该将命令以及命令的结果播放回屏幕)并将其放入变量中,但实际上我没有得到命令输出到屏幕。例子:
RESULT=$(db2 -v drop table blah)
我最终不得不cat ${RESULT}
将上面的管道的屏幕打印打印到发球台,然后我仍然必须传递RESULT
给我的解析函数。
我尝试过的另一件事是将命令的结果也通过管道传输到文件中。例子:
db2 -v drop table blah | tee myResult
这将输出到我的高级 T 恤的屏幕上,但现在我的文件系统上有一个额外的文件,我必须担心事后的清理(尽管我可以egrep
并且cat
没有任何问题)。如果我的工作在脚本中崩溃tee
,并且本身通过管道传输导致tee
一些奇怪的行为(如果它成功而不崩溃,则工作正常)。这让我相信双管tee
不是最好的选择。
有人向我提到过这个script
命令,但我不确定这是否有帮助?
有什么想法或想法吗?我假设我不是唯一一个希望使用特定命令的“屏幕捕获”来进行错误解析,同时仍然将所有内容通过管道传输到tee
整个作业运行的人。
另外,我倾向于使用子脚本调用子 shell,而不是像在同一个 shell 中那样调用它们(即ksh blah.sh
vs . ./blah.sh
)。它似乎最适合我的脚本。不确定这是否会影响任何答案。
任何基于经验的指导将不胜感激。
答案1
没有理由使用tee
or script
。除非您希望在事后离线进行分析。
script
typescript
默认情况下,但不一定会捕获 shell 会话的文本输出并将其放入文件中。追加或覆盖由您决定。
tee
允许您将正在运行的命令的输出转储到文件中并允许它也显示在屏幕上。
我个人的偏好是:
<command> 2>&1 > <filename>
如果您需要稍后可以分析的交易日志。如果您需要在command
运行时分析它们,那么只需将输出转储到文件中会更聪明:
<command> | <script> 2>&1 > <filename>
通过这种方式,您可以让脚本有选择地或完全地将输出转储到文件中,并执行其他任务,例如通知(电子邮件、短信、寻呼、监控软件通知),而无需停止command
.
如果您想查看文件中现在发生的情况,请将作业置于后台:
<command> 2>&1 > <filename> &
并尾随
tail -f <filename>
我假设输出是文本而不仅仅是消息代码。