systemd 15.04 не зафіксує stdout одиниці


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-запити до stdout - це добре перевірено. Однак, коли я переглядаю журнали 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)і це зробило трюк! Вихід почав показуватися в journalctl.
тембрам

Відповіді:


9

Насправді буферизація в UNIX залежить від контексту: коли stdout переспрямовується на щось інтерактивне, наприклад консоль, воно зазвичай буферизація рядків, інакше він повністю буферизований.

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

Але це також можна зробити за допомогою команди stdbuf при запуску:

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

(для футляра, що постачається на лінії)


Це врятувало мені день! Велике спасибі. Але я трохи плутаю це з тим ExecStart=/my/foo/program, чому журнал stdout не змивається, коли служба припиняється, а замість цього повністю зникає.
wlnirvana

0

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

Тож, можливо, stdoutвихід просто перенаправляється на syslogта не зберігається в системному журналі. Для цього вам може знадобитися використовувати стійкий журнал systemd, як пояснено вище.

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


Я створив так, /var/log/journalяк ви згадали, але все одно не бачу складання моєї системної служби. в /var/log/syslogЯ не бачу ні він.
вихід із системи
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.