Рейтинг:0

Как обеспечить отображение вывода из «tee» при использовании в сценарии, запускаемом под systemd

флаг vn

У меня есть сценарий, под которым я работаю системад в котором есть несколько журналов отладки, которые я хотел бы отправить на стандартный вывод (который должен попасть в системный журнал, доступный для просмотра с помощью журналctl), а также в файл журнала в моей файловой системе.

Обычно я тянулся к тройник для этого (запись в стандартный вывод и файлы), и он отлично работает, когда я запускаю скрипт сам по себе (я вижу все свои журналы на своей консоли, а также в моем файле журнала), но когда я запускаю его под системад Я пропускаю кучу вывода из тройник в системном журнале (хотя все журналы находятся присутствует в лог-файле).

Я пробовал несколько вещей, которые не решили проблему:

  • стандартный буфер (как было предложено здесь для принудительного буферизированного вывода строки) в моем ExecStart= в моем служебном файле.
  • StandardOutput=журнал+консоль в моем служебном файле (Стандартный вывод по умолчанию отключен в /etc/systemd/system.conf, поэтому он имеет значение по умолчанию журнал).
  • Удален тройник, Итак эхо просто пишет прямо в stdout. Когда я делаю это, я делать просмотреть все журналы в системном журнале (но я теряю файл журнала). Думаю, я мог бы сделать свой собственный тройник с функцией, которая делает два эхоs (один раз в файл журнала, один раз в стандартный вывод), но это выглядит как хакерство. я бы предпочел использовать тройник, который уже существует для этой цели...

Я воспроизвел эту проблему на Manjaro и Ubuntu (systemd 249 (249.4-2-манджаро) и системад 245 (245.4-4ubuntu3.5)), но я не мочь воспроизвести его на Debian 11 (системд 247 (247.3-6)). Я не вижу какой-либо вопиющей разницы ни в одном из моих конфигов под /etc/системд между работающей системой Debian и неработающей системой Manjaro. Я не уверен, какие другие конфигурации системы могут повлиять на это...

У меня есть полные инструкции по воспроизведению здесь.

Мой сценарий

Живет в /tmp/tee_test.sh.

#!/бин/баш

ФАЙЛ ЖУРНАЛА=/tmp/testtee.log
эхо > "$LOGFILE"
echo "мне нравится пирог" | тройник -a "$LOGFILE"

я=2
пока :; делать
    echo "Я съем $i кусочков пиццы" | тройник -a "$LOGFILE"
    ((я++))
    спать 1
сделано

Мой системный модуль

Живет в ~/.config/systemd/пользователь/tee_test.service и загружается с systemctl --user демон-перезагрузка каждый раз меняю.

[Ед. изм]
Description=Тестовый тройник под systemd

[Оказание услуг]
# тот же результат с любым из следующих двух вариантов
ExecStart=/tmp/tee_test.sh
# ExecStart=stdbuf -i0 -o0 -e0 /tmp/tee_test.sh

# тот же результат с этим парнем или без него
StandardOutput=журнал+консоль

[Установить]
WantedBy=default.target

Журналы в системном журнале

Просмотр с journalctl --user -x -u tee_test.service. Я вижу только часть журналов.

20 октября, 09:49:03 grinchel systemd[2678]: начат тестовый запуск под systemd.
▪️ Тема: Стартовое задание для устройства UNIT успешно завершено
▪️Определено: systemd
✓ Поддержка: https://forum.manjaro.org/c/support
â
▪ Стартовое задание для устройства UNIT успешно завершено.
â
❖ Идентификатор задания — 8193.
20 окт 09:49:26 гринчел tee_test.sh[399363]: я съем 25 кусочков пиццы
20 окт 09:49:40 гринчел tee_test.sh[400047]: я съем 39 кусочков пиццы
20 окт 09:49:48 гринчел tee_test.sh[400430]: я съем 47 кусочков пиццы
20 окт 09:49:49 гринчел tee_test.sh[400496]: я съем 48 кусочков пиццы
20 окт 09:49:50 гринчел tee_test.sh[400529]: я съем 49 кусочков пиццы
20 окт 09:49:51 гринчел tee_test.sh[400595]: я съем 50 кусков пиццы
20 окт 09:50:14 гринчел tee_test.sh[401790]: я съем 73 куска пиццы
20 октября, 09:50:27 grinchel systemd[2678]: остановка тестового запуска под systemd...

Журналы в файле журнала

В моем файле журнала я вижу все журналы.

мне нравится пирог
я съем 2 куска пиццы
я съем 3 куска пиццы
я съем 4 куска пиццы
я съем 5 кусков пиццы
я съем 6 кусков пиццы
я съем 7 кусков пиццы
[...много похожих строк вырезано - они все присутствуют в последовательности, как и ожидалось...]
я съем 84 куска пиццы
я съем 85 кусков пиццы
я съем 86 кусков пиццы

Любые идеи, что здесь происходит? Как я могу убедиться, что весь вывод из тройник появляется в моем системном журнале?

Ginnungagap avatar
флаг gu
Пробовали ли вы посмотреть, что произойдет, если вы не будете использовать tee, а просто позволите ему попасть только в журнал? Вы получаете полный вывод тогда?
флаг vn
@Ginnungagap да, если я уберу тройник, я увижу весь вывод. Добавление этого в список вещей, которые я пробовал в своем посте.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.