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

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

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

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

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

Я воспроизвел эту проблему на 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появляется в моем системном журнале?

0 ответов

Другие вопросы по тегам