Как гарантировать, что буфер 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 restartjournald в большинстве случаев не получить 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, это известная проблема.

Я задал тот же вопрос в системном почтовом ящике и получил ответ со ссылкой на сообщенную проблему.

Другие вопросы по тегам