0

我正在尝试创建一个脚本来检查服务器数据库之间的连接!

为此,我需要捕获日志,但日志显示在屏幕上而不是文件中。

文件:

主文件

#!/bin/ksh
server[0]="database1_tcp"
server[1]="database2_tcp"
server[2]="database3_tcp"
for i in "${server[@]}";
 do
  query.scr $i>>log_test.dat
 done

查询.scr

#!/bin/ksh
DBACCESS testdb << EOSQLF
SELECT *
   FROM testdb@$1:some_table
EOSQLF

log_test.dat:

checking the connectivity for server: database1_tcp

field1 field2

     A      A

***********************************************
checking the connectivity for server: database2_tcp

***********************************************
checking the connectivity for server: database3_tcp


field1 field2

     A      A

***********************************************

终端输出

当我运行 main.scr 时屏幕上会出现什么:

Database selected.


1 row(s) retrieved.


Database closed.


Database selected.


908: Attempt to connect to database server (database2_tcp) failed.
Error in line 3
Near character position 1

Database closed.


Database selected.


1 row(s) retrieved.


Database closed.

有没有办法将屏幕上出现的消息定向到某个日志文件,或者您能提出更好的方法吗?

4

1 回答 1

3

正如shellter 所 建议的那样,DB-Access ( dbaccess) 将其一些输出写入标准错误,而将一些输出写入标准输出。(请注意,虽然dbaccess将错误消息写入标准错误,但它也会在那里写入其他状态信息。)您需要同时捕获两者,因此您需要修改脚本2>&1以将文件描述符 2(也称为标准错误)发送到同一个地方该文件描述符 1(又名标准输出)正在:

#!/bin/ksh
server[0]="database1_tcp"
server[1]="database2_tcp"
server[2]="database3_tcp"
for i in "${server[@]}"
do
    query.scr $i >>log_test.dat 2>&1
done

(相同的重定向在大约 1979 年的第 7 版 Unix Bourne shell 及其继承者如 Bash 和 Korn shell 中有效。该 URL 正式指向 Bash 文档;这部分在 Korn shell 中也同样有效。)

您可能会发现我的SQLCMD程序在这方面做得更好。它是为在脚本中使用而设计的,将正常输出写入标准输出,将错误写入标准错误,并且首先不那么冗长(除非您将其调整为冗长)。它与 Microsoft 的同名 johnny-come-lately 程序没有任何关系(除了名称和一般用途)——但如果您不小心,MS 会设法主导搜索。

于 2016-08-20T17:53:18.140 回答