0

サーバー データベース間の接続を確認するスクリプトを作成しようとしています。

そのためにはログをキャプチャする必要がありますが、ログはファイルではなく画面に表示されます。

ファイル:

main.scr

#!/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 シェル、および Bash や Korn シェルなどの継承者で機能します。URL は正式には Bash ドキュメントへのものです。この部分は、Korn シェルでも同じように機能します。)

この点では、私のSQLCMDプログラムの方が優れていることがわかるかもしれません。スクリプトで使用するように設計されており、通常の出力を標準出力に、エラーを標準エラーに書き込みます。また、最初から冗長ではありません (詳細に調整しない限り)。これは、Microsoft の同名の johnny-come-lately プログラムとは (名前と一般的な目的を除いて) 何の関係もありませんが、注意しないと、MS が検索を支配しています。

于 2016-08-20T17:53:18.140 に答える