Busybox ASH внутри initrd имеет проблему при подключении тройника к sed

Busybox ASH внутри initrd имеет проблему при подключении тройника к 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

Приведенный выше фрагмент кода помещается в ранний загрузочный скрипт инициализации (оболочка — busybox ash) внутри initrd, а вывод записывается в /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

Решил. Оказалось, мне нужно было сбросить дескрипторы файлов stdout и stderr, которые я использовал перед вызовом switch_rootstage-1-init.sh.

Связанный контент