systemd 15.04 не будет регистрировать стандартный вывод устройства
В настоящее время я пытаюсь сделать системный модуль в качестве веб-сервера. В настоящее время мой 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? Заранее спасибо, любая помощь с этим будет высоко ценится!
2 ответа
Фактически, буферизация в UNIX зависит от контекста: когда stdout перенаправляется во что-то интерактивное, например, консоль, - обычно это буферизация строки, в противном случае она полностью буферизуется.
Буферизация может быть изменена внутри приложения с помощью вызова библиотеки setvbuf.
Но это также можно сделать командой stdbuf при запуске:
ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo
(для случая с буферизацией строки)
По умолчанию в Ubuntu 15.04системные журналы являются нестабильными и хранятся в /run/systemd/journal
и теряются при каждой перезагрузке. Чтобы использовать постоянный журналsystemd, вам нужно создать /var/log/journal
каталог (и перезапустите systemd-journald.service).
Так что, может быть, stdout
вывод просто перенаправлен на syslog
и не хранится в системном журнале. Для этого вам может понадобиться постоянный системный журнал, как описано выше.
Вы проверили /var/log/syslog
для тебя foo
журнал?