В настоящее время я пытаюсь сделать системный модуль в качестве веб-сервера. В настоящее время мой 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 ? Заранее спасибо, любая помощь с этим будет высоко ценится!
print('Hello World!', flush=True)
и это помогло! Выход начал отображаться в журнале.Ответы:
Фактически, буферизация в UNIX зависит от контекста: когда stdout перенаправляется во что-то интерактивное, например, консоль, - обычно это буферизация строки, в противном случае она полностью буферизуется.
Буферизацию можно изменить внутри приложения с помощью вызова библиотеки setvbuf .
Но это также можно сделать командой stdbuf при запуске:
(для случая с буферизацией строки)
источник
ExecStart=/my/foo/program
, почему журнал stdout не сбрасывается при завершении службы, а полностью исчезает.По умолчанию на 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
я не вижу ни этого.