当通过管道将 tee 传输到 sed 时,initrd 内的 Busybox ASH 出现问题

当通过管道将 tee 传输到 sed 时,initrd 内的 Busybox ASH 出现问题

我正在尝试记录初始化脚本的早期启动输出。这是正在起作用的:

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 脚本(shell 是 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

解决了。结果我需要重置switch_root在 stage-1-init.sh 中调用之前使用的 stdout 和 stderr 文件描述符。

相关内容