Opção StandardOutput do systemd não está funcionando

3

Estou usando systemd para iniciar um programa na inicialização e mantê-lo em execução em segundo plano.

Eu escrevi um script simples para systemd chamar e o script irá imprimir várias linhas de logs que gostaria de ver no terminal.

Por isso, defino StandardOutput=journal+console na configuração do serviço, mas não consegui ver as saídas nem no terminal nem no diário.

frederick@Frederick-PC:~$ sudo systemctl start my_program.service
frederick@Frederick-PC:~$ journalctl _SYSTEMD_UNIT=my_program.service
No journal files were found.
-- No entries --

E estas são a configuração do meu serviço e o script.

/etc/systemd/system/my_program.service

[Unit]
Description=Start my_program client after system is booted

[Service]
Type=forking
ExecStart=/usr/bin/my_program.sh start
ExecStop=/usr/bin/my_program.sh stop
PIDFile=/run/my_program.pid
WorkingDirectory=/home/frederick/Applications/my_program-go/
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target

/usr/bin/my_program.sh

#!/bin/sh

start() {
    if [ -f /run/my_program.pid ]; then
        kill -0 $(cat /run/my_program.pid) > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            echo "my_program has been already started"
            exit 1
        fi
    fi
    echo -n "Starting my_program... "
    nohup /home/frederick/Applications/my_program-go/my_program-local -c /home/frederick/Applications/my_program-go/config.json >> /home/frederick/Applications/my_program-go/my_program.log 2>&1 &
    if [ $? -gt 0 ]; then
        echo "failed"
        rm /run/my_program.pid > /dev/null 2>&1
    else
        echo $! | tee /run/my_program.pid
    fi
}

stop() {
    if [ -f /run/my_program.pid ]; then
        echo -n "Stopping my_program... "
        msg=$(kill $(cat /run/my_program.pid) 2>&1)
        if [ $? -gt 0 ]; then
            echo "failed"
            echo $msg
        else
            rm /run/my_program.pid > /dev/null 2>&1
            echo "succeeded"
        fi
    else
        echo "my_program not started"
    fi
}

restart() {
    stop
    start
}

case $1 in
    start|stop|restart)
        "$1"
        ;;
    *)
        echo "No such operation"
        exit 1
        ;;
esac

Como posso ver essas linhas impressas por echo no script? Por favor me ajude, obrigado.

    
por Frederick Zhang 02.09.2015 / 00:16

1 resposta

4

I wrote a simple script for systemd to call …

… qual foi a fonte do problema. Seu "script simples" cancelou onde a saída padrão e o erro padrão foram enviados. E isso totalmente desnecessariamente. Todo o redirecionamento, gravação de arquivo PID, nohup -ing e forking é totalmente desnecessário para algo que já é daemonizado e já tem seu PID conhecido pelo gerenciador de serviços. Você não precisa de nenhuma parte desse script. Em vez disso, escreva sua unidade de serviço assim:

[Unit]
Description=Start my_program client after system is booted

[Service]
Type=simple
ExecStart=/home/frederick/Applications/my_program-go/my_program-local -c /home/frederick/Applications/my_program-go/config.json
WorkingDirectory=/home/frederick/Applications/my_program-go/
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target

Invoque todas as opções necessárias para impedir que o seu programa bifurque, a menos que ele realmente implemente o protocolo de prontidão de bifurcação. Muito poucos programas realmente fazem. Seu "script simples" certamente não o fez, pois saiu do processo pai muito antes de o daemon inicializar e estar pronto.

Leitura adicional

por 02.09.2015 / 13:06

Tags