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?