initrd 内の Busybox ASH で tee を sed にパイプするときに問題が発生します

initrd 内の Busybox ASH で tee を sed にパイプするときに問題が発生します

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 内の初期ブート init スクリプト (シェルは 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。ファイルは完全に空ですが、ファイルは作成されています。

起動したシステムに busybox をローカルにインストールして、ASH および busybox バージョンの tee と sed をテストし、下位バージョンを実行したところ、正常に動作しました。しかし、何らかの理由で、起動中に下位バージョンを実行すると、ログ ファイルが空になります。

何が間違っているのでしょうか? リダイレクトと関係があるように思えます。

答え1

解決しました。stage-1-init.sh を呼び出す前に使用した stdout および stderr ファイル記述子をリセットする必要があることが判明しましたswitch_root

関連情報