この非常に単純なBashスクリプトのペアは、AlmaLinux 8.6で期待どおりに機能しません。
最初のスクリプトは、Unixソケットの前で事前/後処理を実行する単純なゲートウェイとして機能します。また、ロギング用の2番目のスクリプトを呼び出します。コマンドの記録に失敗したため、ゲートウェイ機能の実装を中断しないでください。 (下記のスクリプトは問題を強調するように設計されたバージョンであり、実際のスクリプトはより複雑です。)
最初のスクリプトの問題は、その... || true
構成を使用しても、ロギングコマンドのエラーは無視されず、スクリプト全体が失敗することです。なぜこれですか?
このゲートウェイサービスの消費者は、次のような応答を期待しています。標準出力といくつかのエラーメッセージ猫どういうわけかチャンネルに入ったようです。ロギングが失敗した場合の失敗は、以下のスクリプトではなくゲートウェイユーザーのようです。現在、問題が何であるかを把握するために追加のテストを実施しています。この質問を詳しく更新します。
10月22日編集:問題はパイプコンシューマーへのインターフェースにあります。以下のコメントをご覧ください。
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
sock_file="/path/to/my.sock"
in_cmd="/path/to/my_in.sh"
out_cmd="/path/to/my_out.sh"
log_cmd="/path/to/my_log.sh" # See second script below
exec 3<&0
$log_cmd <&3 >/dev/null || true
exec 3<&-
exec $in_cmd | nc -U -N "$sock_file" | $out_cmd
2番目のスクリプトの問題は、何も記録しないことです。それで得ると思いました。標準入力上記の親スクリプトでFD 3に設定しますか?
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
log_file="/tmp/in.log"
stdbuf -iL cat >>"$log_file"
さらに - これは、実際の経験と矛盾するように見える警告メッセージを解釈しようとする問題に近いです。猫渡す標準バッファ上記のように、標準エラー」stdbuf:ラインバッファリングstdinは意味がありません「しかし、私が入力すると猫バッファリングなし、使用するかstdbuf -i0 ...
どうか標準バッファとにかくスクリプトは「cat: -: リソースを一時的に使用できません。「。だからラインバッファリングだと思います。標準入力無意味ですか、それとも何か抜けましたか?