3

Я использую systemd для запуска программы при загрузке и поддержки ее работы в фоновом режиме.

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

Поэтому я установил StandardOutput=journal+console в конфигурации службы, но я не смог увидеть выходные данные ни в терминале, ни в журнале.

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 --

И это моя конфигурация сервиса и скрипт.

/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

Как я могу увидеть эти строки, напечатанные echo в сценарии? Пожалуйста, помогите, спасибо.

1 ответ1

4

Я написал простой скрипт для вызова systemd ...

... которая была источником проблемы. Ваш "простой скрипт" переопределил, куда были отправлены стандартный вывод и стандартная ошибка. И это совершенно излишне. Перенаправление, запись файла PID, nohup -ing и разветвление совершенно не нужны для чего-то, что уже демонизировано и уже имеет свой PID, известный диспетчеру службы. Вам не нужна никакая часть этого сценария вообще. Вместо этого напишите свой сервисный блок так:

[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

Вызовите все необходимые параметры, чтобы не допустить разветвления вашей программы, если только она действительно не реализует протокол готовности разветвления. Очень немногие программы на самом деле делают. Ваш "простой скрипт", конечно же, этого не сделал, поскольку он вышел из родительского процесса задолго до того, как демон инициализировался и был готов.

дальнейшее чтение

  • Джонатан де Бойн Поллард (2015). Системный дом ужасов. Часто задаваемые ответы.
  • Systemd убивает сервис сразу после запуска
  • Проблема скрипта службы Yocto Linux
  • Страница man systemd.exec (а также systemd.service и systemd.unit). Страница man говорит: Файлы конфигурации модулей для сервисов, сокетов, точек монтирования и устройств подкачки совместно используют подмножество опций конфигурации, которые определяют среду выполнения порожденных процессов.На этой странице руководства перечислены параметры конфигурации, общие для этих четырех типов устройств.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .