systemd 15.04 не будет регистрировать стандартный вывод устройства

12

В настоящее время я пытаюсь сделать системный модуль в качестве веб-сервера. В настоящее время мой foo.serviceфайл выглядит следующим образом:

[Unit]
Description=The Foo Web Server

[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo

[Install]
WantedBy=multi-user.target

fooИсполняемый файл автоматически регистрирует все запросы HTTP на стандартный вывод - это хорошо протестирован. Однако, когда я просматриваю логи с помощью journalctl -u foo, я получаю только вывод, подобный этому:

...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...

Может кто-нибудь объяснить, почему он не регистрирует весь вывод stdout? Я кратко посмотрел на этот предыдущий вопрос , но он не помогает - однако он ссылается на что-то вроде «... может не работать для систем, которые не используют полный systemd» - будет ли это в Ubuntu 15.04 ? Заранее спасибо, любая помощь с этим будет высоко ценится!

Атан Кларк
источник
1
Убедитесь, что ваш процесс не буферизует вывод. У меня была похожая проблема, и она была решена путем отключения буферизации вывода моего скрипта Python. Поскольку количество создаваемых записей журнала было невелико, казалось, что ведения журнала нет, но на самом деле у него еще не было шансов, так как все все еще собиралось в выходном буфере stdout.
Ян Влчинский
1
Пытаюсь это тоже исправить. У меня сложилось впечатление, что systemd выполняет буферизацию. stdout буферизуется в UNIX, но systemd выполняет свои функции и буферизует намного больше (возможно, для быстрой, но бесполезной).
Велкан
У меня была та же проблема, и проблема была связана с буферизацией в функции печати Python! Так как я использовал Python 3, я просто использовал что-то подобное, print('Hello World!', flush=True)и это помогло! Выход начал отображаться в журнале.
Тимбрам

Ответы:

9

Фактически, буферизация в UNIX зависит от контекста: когда stdout перенаправляется во что-то интерактивное, например, консоль, - обычно это буферизация строки, в противном случае она полностью буферизуется.

Буферизацию можно изменить внутри приложения с помощью вызова библиотеки setvbuf .

Но это также можно сделать командой stdbuf при запуске:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(для случая с буферизацией строки)

Velkan
источник
Это спасло мой день! Большое спасибо. Но меня немного смущает ExecStart=/my/foo/program, почему журнал stdout не сбрасывается при завершении службы, а полностью исчезает.
wlnirvana
0

По умолчанию на Ubuntu 15.04 , Systemd журналы только летучие и хранятся в /run/systemd/journalи теряются при каждой перезагрузке. Чтобы использовать постоянный журнал systemd , вам нужно создать /var/log/journalкаталог (и перезапустить systemd-journald.service).

Таким образом, возможно, stdoutвывод просто перенаправлен syslogи не хранится в системном журнале. Для этого вам может понадобиться постоянный системный журнал, как описано выше.

Вы проверили /var/log/syslogсвой fooжурнал?

солнцестояние
источник
Я создал, /var/log/journalкак вы упомянули, но я все равно не вижу stdout моего сервиса systemd. в этом /var/log/syslogя не вижу ни этого.
выход