1

バックグラウンド

何らかの理由で感嘆符構文を使用していくつかの UNIX コマンドを実行する必要がある長いSql*plusスクリプトがあります。

プロセスの最後にログ ファイルを作成するために、スプールに書き込みます。

問題は、OS コマンドが失敗した場合、stderrが失われ、スプール ファイルに移動しないことです。

サンプルコード

spool mylog.txt
!echo alter user xxx identified by yyyy;
alter user xxx identified by yyyy;
!echo cp file1 folder1/
!cp file1 folder1/
!echo alter user yyy identified by xxx;
alter user yyy identified by xxx;
!echo cp file2 folder2/
!cp file2 folder2/
spool off

失敗した場合cp、mylog.txt を見ただけではわかりません。

明らかに、そう!cp file1 folder1/ &> mylog.txtすることは、スプールされているログを予測できない方法で台無しにするだけです。

質問

UNIX コマンドの stderr をスプール先のファイルに書き込むにはどうすればよいですか?

アップデート

stderrをstdoutにリダイレクトするために、すべてのcpコマンドの最後に追加して、 lc.の提案 を試しましたが、次のようになりました。2>&1

Enter value for 1:

更新 2

SET DEFINE OFF値を入力しないようにしました。スプールされないのは stderr だけではなく、stdout もスプールされないことがわかりました。すべて「!」で実行されたようです。はスプール不可です。

4

3 に答える 3

2

実際には、stdout と stderr は失われませんが、スプール ファイルには入りません。

スクリプトを考えるとecho.sql

spool sql.out
select 1 from dual ;
!echo 1
!invalid command
spool off

シェルからスクリプトを起動すると、次のようになります。

sqlplus *connect string*  @echo.sql > host.out 2> host.err

SQL コマンドからsql.outの出力は に、echo からの出力は にhost.out、エラー メッセージは に表示されhost.errます。スクリプトを非対話的に (cron などから) 起動する場合は、他の非 sql*plus スクリプトと同様に stdout/stderr をキャプチャする必要があります。

コメントに関する編集

スクリプト ファイルのオプションSET TERMOUT ONを使用すると、SQL コマンドの出力がスプール ファイルと stdout の両方に含まれます。

最後に、すべてを 1 つのファイルに収めたい場合は、次のようにスクリプトを呼び出すことができます。

sqlplus *connect string*  @echo.sql &>echo.log

スプール ファイルには、まだ sql の出力が残っています。

于 2013-08-07T20:24:58.437 に答える
1

各コマンドにa を追加して、 2>&1stderr を stdout にリダイレクトできます。

于 2013-08-07T11:50:12.253 に答える
0

シェル コマンドの出力を sqlplus スプール ファイルに送信する場合、SPOOL がファイルを書き込み用にロックしている間は送信できません。私のために働いた.sqlスクリプトのシーケンスは次のとおりです。

SPOOL out.log

...ここにSQLのものがあります...

スプールオフ

ホスト ps -eaf | grep 何か 1>>out.log

SPOOL out.log APPEND

...その他のSQL関連...

于 2014-04-03T02:32:14.943 に答える