Как гарантировать, что буфер stdout между systemd и journald очищается при выходе из программы?
Упрощенный пример, который демонстрирует проблему
#include <stdio.h>
int main(void)
{
printf("foo\n");
fflush(stdout);
getchar();
return 0;
}
(хотя это не зависит от языка программирования - исходное приложение, с которым я обнаружил проблему, находится в Go).
Если он скомпилирован и выполняется следующим модулем:
[Unit]
Description=description
After=network.target
[Service]
ExecStart=/path/to/binary
[Install]
WantedBy=multi-user.target
Затем на systemctl restart
journald
в большинстве случаев не получить foo\n
выход, в то время как syslog
успешно записывает это в /var/log/syslog
,
Вот пример journald
выход за услугу:
May 18 08:30:38 hostname systemd[1]: Stopped servicename
May 18 08:30:38 hostname systemd[1]: Started servicename
May 18 08:30:38 hostname systemd[1]: Stopped servicename
May 18 08:30:38 hostname systemd[1]: Started servicename
May 18 08:30:38 hostname servicename[7701]: foo
May 18 08:30:41 hostname systemd[1]: Stopped servicename
May 18 08:30:41 hostname systemd[1]: Started servicename
May 18 08:30:46 hostname systemd[1]: Stopped servicename
May 18 08:30:46 hostname systemd[1]: Started servicename
а затем соответствующая часть /var/log/syslog
:
May 18 08:30:38 hostname systemd[1]: Stopped servicename.
May 18 08:30:38 hostname systemd[1]: Started servicename.
May 18 08:30:38 hostname servicename[7682]: foo
May 18 08:30:38 hostname systemd[1]: Stopped servicename.
May 18 08:30:38 hostname systemd[1]: Started servicename.
May 18 08:30:38 hostname servicename[7701]: foo
May 18 08:30:41 hostname systemd[1]: Stopped servicename.
May 18 08:30:41 hostname systemd[1]: Started servicename.
May 18 08:30:41 hostname servicename[7720]: foo
May 18 08:30:46 hostname systemd[1]: Stopped servicename.
May 18 08:30:46 hostname systemd[1]: Started servicename.
May 18 08:30:46 hostname servicename[7739]: foo
Каков был бы способ гарантировать, что журнал получил stdout
если есть?
1 ответ
Решение
Tldr, это известная проблема.
Я задал тот же вопрос в системном почтовом ящике и получил ответ со ссылкой на сообщенную проблему.