Как обеспечить отображение вывода «tee» при использовании в скрипте, запускаемом под systemd
У меня есть сценарий, под которым я работаю, и в котором есть несколько журналов отладки, которые я хотел бы отправить на стандартный вывод (который должен оказаться в системном журнале, который можно просмотреть с помощьюjournalctl
), а также в файл журнала в моей файловой системе.
Обычно я добиваюсь этого (записываю в стандартный вывод и файлы), и это работает нормально, когда я запускаю сценарий сам по себе (я вижу все свои журналы на консоли, а также в файле журнала), но когда я запустить его подsystemd
Мне не хватает некоторых выводов в системном журнале (хотя все журналы присутствуют в файле журнала).
Я попробовал несколько вещей, которые не решили проблему:
-
stdbuf
(как предложено здесь для принудительного вывода с буферизацией строки) в моемExecStart=
в моем служебном файле. -
StandardOutput=journal+console
в моем служебном файле (DefaultStandardOutput
не установлено в/etc/systemd/system.conf
, поэтому он имеет значение по умолчаниюjournal
). - Удален , поэтому он просто пишет прямо на стандартный вывод. Когда я это делаю, я вижу все журналы в системном журнале (но теряю файл журнала). Думаю, я мог бы создать свою собственную функцию, которая выполняет два
echo
s (один раз в файл журнала, один раз в стандартный вывод), но это выглядит как-то хакерски. Я бы предпочел использовать , который уже существует для этой цели...
Я воспроизвел эту проблему на Manjaro и Ubuntu (systemd 249 (249.4-2-manjaro)
иsystemd 245 (245.4-4ubuntu3.5)
), но я не могу воспроизвести его в Debian 11 (systemd 247 (247.3-6)
). Я не вижу никакой явной разницы ни в одной из моих конфигураций под/etc/systemd
между рабочей системой Debian и нерабочей системой Manjaro. Я не уверен, какие другие конфигурации системы могут на это повлиять...
У меня есть полные инструкции по воспроизведению здесь.
Мой сценарий
Живет в/tmp/tee_test.sh
.
#!/bin/bash
LOGFILE=/tmp/testtee.log
echo > "$LOGFILE"
echo "i like pie" | tee -a "$LOGFILE"
i=2
while :; do
echo "i shall eat $i slices of pizza" | tee -a "$LOGFILE"
((i++))
sleep 1
done
Мой системный модуль
Живет в~/.config/systemd/user/tee_test.service
и загруженsystemctl --user daemon-reload
каждый раз меняю.
[Unit]
Description=Test teeing under systemd
[Service]
# same result with either of the following two variants
ExecStart=/tmp/tee_test.sh
# ExecStart=stdbuf -i0 -o0 -e0 /tmp/tee_test.sh
# same result with or without this guy
StandardOutput=journal+console
[Install]
WantedBy=default.target
Журналы в системном журнале
Просмотр сjournalctl --user -x -u tee_test.service
. Я вижу только часть журналов.
Oct 20 09:49:03 grinchel systemd[2678]: Started Test teeing under systemd.
░░ Subject: A start job for unit UNIT has finished successfully
░░ Defined-By: systemd
░░ Support: https://forum.manjaro.org/c/support
░░
░░ A start job for unit UNIT has finished successfully.
░░
░░ The job identifier is 8193.
Oct 20 09:49:26 grinchel tee_test.sh[399363]: i shall eat 25 slices of pizza
Oct 20 09:49:40 grinchel tee_test.sh[400047]: i shall eat 39 slices of pizza
Oct 20 09:49:48 grinchel tee_test.sh[400430]: i shall eat 47 slices of pizza
Oct 20 09:49:49 grinchel tee_test.sh[400496]: i shall eat 48 slices of pizza
Oct 20 09:49:50 grinchel tee_test.sh[400529]: i shall eat 49 slices of pizza
Oct 20 09:49:51 grinchel tee_test.sh[400595]: i shall eat 50 slices of pizza
Oct 20 09:50:14 grinchel tee_test.sh[401790]: i shall eat 73 slices of pizza
Oct 20 09:50:27 grinchel systemd[2678]: Stopping Test teeing under systemd...
Журналы в файле журнала
В моем файле журнала я вижу все журналы.
i like pie
i shall eat 2 slices of pizza
i shall eat 3 slices of pizza
i shall eat 4 slices of pizza
i shall eat 5 slices of pizza
i shall eat 6 slices of pizza
i shall eat 7 slices of pizza
[...many similar lines snipped -- they ARE all present in sequence as expected...]
i shall eat 84 slices of pizza
i shall eat 85 slices of pizza
i shall eat 86 slices of pizza
Есть идеи, что здесь происходит? Как я могу убедиться, что весь вывод изtee
появляется в моем системном журнале?