私はAIXでDB2を使用するデータベース管理者です。 (この内容は DB2 に関連しておらず、ksh に関連しているので、読んでください。そうでない場合は、次に公開します。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
完全なタスクの実行にすべてをパイプしながら、エラーの解析に特定のコマンドの「スクリーンキャプチャ」を使用したい唯一の人ではないと仮定します。
ksh blah.sh
また、私はサブシェルを呼び出すために同じシェル(vsなど. ./blah.sh
)で呼び出すのではなく、サブスクリプトを使用する傾向があります。私のスクリプトに最適なようです。これが答えに影響を与えるかどうかはわかりません。
経験に基づいた案内をいただきありがとうございます。
ベストアンサー1
tee
またはを使用する理由はありませんscript
。事実後にオフラインで分析したくないならば。
script
typescript
デフォルトでは必ずしもそうではありませんが、シェルセッションのテキスト出力がキャプチャされ、ファイルに保存されます。追加または上書きはあなた次第です。
tee
実行中のコマンドの出力をファイルにダンプし、画面にも表示できます。
私の個人的な好みは次のとおりです。
<command> 2>&1 > <filename>
後で分析できるトランザクションログが必要な場合。実行時に分析する必要がある場合は、command
出力をファイルにダンプする方が賢明でしょう。
<command> | <script> 2>&1 > <filename>
これにより、スクリプトは出力をオプションまたは完全にファイルにダンプし、通知(電子メール、SMS、ページング、ソフトウェア通知の監視)などの他の操作を停止せずに実行できますcommand
。
今ファイルで何が起こっているのかを確認するには、タスクをバックグラウンドに置きます。
<command> 2>&1 > <filename> &
そして尾
tail -f <filename>
出力はメッセージコードではなくテキストであると仮定します。