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_root
stage-1-init.shを呼び出す前に使用していたstdoutおよびstderrファイル記述子をリセットする必要がありました。