O Journald não registra mensagens de erro antes de falhar na saída do programa

1

Estou invocando um módulo python3 usando o systemd (versão: systemd 232) no debian stretch. O problema é que, se o módulo python gerar uma exceção, a mensagem de exceção (stderr) e algumas impressões anteriores (stdout) não serão enviadas para o diário antes que o módulo saia com falha.

A configuração do serviço é assim:

[Unit]
Description=Some Service
After=network.target

StartLimitIntervalSec=3
StartLimitBurst=2

[Service]
User=foo

PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /var/run/foo
ExecStartPre=/bin/chown user:user /var/run/foo/

Type=simple
PIDFile=/var/run/foo/foo.pid
ExecStart=/usr/local/bin/foo_continual
Restart=always
RestartPreventExitStatus=0
RestartSec=2

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

foo_continual é um script bash que configura um ambiente virtual python e, em seguida, executa o módulo python:

#!/bin/bash
source /home/foo/environment/bin/activate || exit 1
python -u -m foo.main || exit 1

O script contém algumas chamadas print() . Eu até testei flush=True para um deles, e ele contém uma exceção que deve ser impressa em stderr e fazer com que o programa saia com um código de saída não-0. O problema é que os logs do journald não contêm a saída completa, incluindo a mensagem de erro:

Dec 01 18:32:07 TESTING systemd[1]: foo.service: Service hold-off time over, scheduling restart.
Dec 01 18:32:07 TESTING systemd[1]: Stopped Some Service.
Dec 01 18:32:07 TESTING systemd[1]: Started Some Service.
Dec 01 18:32:08 TESTING foo_continual[50903]: Print some stuff...
Dec 01 18:32:08 TESTING systemd[1]: foo.service: Main process exited, code=exited, status=1/FAILURE
Dec 01 18:32:08 TESTING systemd[1]: foo.service: Unit entered failed state.
Dec 01 18:32:08 TESTING systemd[1]: foo.service: Failed with result 'exit-code'.
Dec 01 18:32:10 TESTING systemd[1]: foo.service: Service hold-off time over, scheduling restart.
Dec 01 18:32:10 TESTING systemd[1]: Stopped Some Service.
Dec 01 18:32:10 TESTING systemd[1]: Started Some Service.
Dec 01 18:32:10 TESTING systemd[1]: foo.service: Main process exited, code=exited, status=1/FAILURE

Deverá imprimir mais texto, incluindo um erro no stderr depois de "Print some stuff". Como eu posso fazer o jorunald gravar toda a saída antes do programa sair?

    
por Matthew Mitchell 01.12.2017 / 20:03

1 resposta

1

A única solução que encontrei não é boa, mas funciona. No arquivo bash, durma antes de sair para dar ao journald chance de gravar a saída:

#!/bin/bash
function fail {
    sleep 2
    exit 1
}
source /home/foo/environment/bin/activate || fail
python -u -m foo.main || fail
    
por 01.12.2017 / 20:03