ティーをsedで接続するときのinitrd内のBusybox ASHの問題

ティーをsedで接続するときのinitrd内のBusybox ASHの問題

initスクリプトの初期開始出力を記録しようとしています。これがうまくいくことです:

mkdir -p /run/log && \
mkdir -p /tmp && \
mkfifo /tmp/stage-1-init.log.fifo1 && \
mkfifo /tmp/stage-1-init.log.fifo2

tee -i < /tmp/stage-1-init.log.fifo1 /run/log/stage-1-init.log &
exec > /tmp/stage-1-init.log.fifo1 2>&1

上記のコードスニペットはinitrd(シェルはbusybox ash)内の初期起動初期化スクリプトに配置され、出力は後で起動されたシステム/run/log/stage-1-init.logで表示されるファイルに書き込まれ、その中に内容があります。

sedしかし、空の行をフィルタリングするためにフィルタを追加してみました。

mkdir -p /run/log && \
mkdir -p /tmp && \
mkfifo /tmp/stage-1-init.log.fifo1 && \
mkfifo /tmp/stage-1-init.log.fifo2

tee -i < /tmp/stage-1-init.log.fifo1 /tmp/stage-1-init.log.fifo2 &
sed '/^$/d' < /tmp/stage-1-init.log.fifo2 > /run/log/stage-1-init.log &
exec > /tmp/stage-1-init.log.fifo1 2>&1

/run/log/stage-1-init.log下のスクリプトに変更すると、出力はまったくありません。ファイルは完全に空ですが、ファイルが生成されます。

ASHバージョンとビジーボックスバージョンのteeとsedをテストするために、ブートされたシステムにビジボックスをローカルにインストールし、ボトムバリアントを実行しました。ただし、何らかの理由で、下のバリアントは起動時に空のログファイルを生成します。

何が間違っている可能性がありますか?リダイレクトと関係があるようですが?

答え1

解決しました。ご存じのとおり、switch_rootstage-1-init.shを呼び出す前に使用していたstdoutおよびstderrファイル記述子をリセットする必要がありました。

関連情報