systemd StandardOutput para um arquivo _e_ para o diário?

systemd StandardOutput para um arquivo _e_ para o diário?

Estou realizando regularmente um programa de processamento de dados de longa duração (cerca de 5 dias). Estou usando o Ubuntu e executando o comando com uma tarefa transitória do systemd via systemd-run --unit data_import /path/to/my-script.sh. Está funcionando bem. Posso ver a saída padrão de registro do script com journalctl -u data_import.service.

Gostaria que o stdout (& stderr) do script fosse salvo em um arquivo, assim como no diário do systemd. Vejo que isso systemd-run --unit data_import -p "StandardOutput=file:/path/my-logging-file.txt …salvará o stdout nesse arquivo. No entanto, ele não será registrado no diário. Tentei fornecer o argumento duas vezes systemd-run -p "StandardOutput=file:/path/my-logging-file.txt" -p "StandardOutput=journal" …, mas não funcionou.

É possível com o systemd registrar o stdout em um arquivoepara o diário do systemd? (da mesma forma para stderr?)

Ubuntu 18.04 e 20.04, systemd v250. ou v245 etc.

Responder1

Acho que não podemos deixar de encontrar uma referênciahttps://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=o que pode ajudar (preste atenção aLeva um doscorda).

Controla onde o descritor de arquivo 1 (stdout) dos processos executados está conectado.Leva um dosherdar, nulo, tty, diário, kmsg, diário+console, kmsg+console, arquivo:caminho, anexar:caminho, truncar:caminho, soquete ou fd:nome.

Embora possamos alterar o tipo de saída padrão padrão.

Responder2

Você tentou criar um arquivo de log diretamente em seu script e adicionar as informações sempre que necessário? Eu sei que é bastante óbvio, mas estou curioso para ver se funciona.

Por exemplo, com bash, diretamente no seu script:

# Declaration
LOG=/var/log/your_script_log.log
# Or with a date 
TODAY=$(date +%Y-%m-%d)
LOG=/var/log/your_script_log-$(TODAY).log
...
# Beginning of main script
echo -e $TODAY > $LOG
...
# Every time needed during the script
if [[ $state == *"stopped"* ]];then
    echo "A very important message." >> $LOG
...

Com um sistema como este você precisará configurar um logrotate para evitar centenas de logs após alguns meses.

Responder3

@Amandasaurus Ok, eu entendo. Então eu recomendo que você crie um arquivo de serviço em "/etc/systemd/system/[O nome do seu script].service" e adicione as informações mínimas necessárias:

[Unit]
Description=*The name of your script*

[Service]
ExecStart=/path/to/my-script.sh
ExecStop=/bin/kill $MAINPID
KillMode=process
Type=simple
StandardOutput=/path_to_log/service.log
StandardError=/path_to_log/service_error.log

[Install]
WantedBy=multi-user.target

E então configure um logrotate ou adicione "append" ao argumento StandardOutput. Depois disso faça o seguinte:

systemctl daemon-reload
systemctl start *The name of your service*

Para ativar o início na inicialização do seu serviço:

systemctl enable *The name of your service*

Fonte do argumento de log no arquivo de serviço:aqui

informação relacionada