У меня есть сценарий, под которым я работаю системад
в котором есть несколько журналов отладки, которые я хотел бы отправить на стандартный вывод (который должен попасть в системный журнал, доступный для просмотра с помощью журнал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 кусков пиццы
Любые идеи, что здесь происходит? Как я могу убедиться, что весь вывод из тройник
появляется в моем системном журнале?