1

Я написал этот простой сервис systemd для запуска моего приложения при загрузке:

[Unit]
Description=Autostart
After=multi-user.target

[Service]
Environment=LD_LIBRARY_PATH=/home/pi/bin
ExecStart=/home/pi/bin/Server
Restart=on-failure
RestartSec=3
User=root
Group=root

[Install]
WantedBy=multi-user.target

Я включил службу и перезагрузился. При запуске MyApp не работает и статус сервиса "мертв":

● autostart.service - Autostart
   Loaded: loaded (/lib/systemd/system/autostart.service; enabled; vendor preset: enabled)
   Active: inactive (dead)

без дальнейших указаний. Насколько я знаю, если мое приложение дает сбой, статус должен сообщать код ошибки выхода. Кроме того, он должен перезагрузиться через 3 секунды.

Вместо этого запуск службы вручную приводит к ожидаемому поведению:

● autostart.service - Autostart
   Loaded: loaded (/lib/systemd/system/autostart.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2017-10-20 12:06:39 CEST; 2min 32s ago
 Main PID: 1189 (Server)
   CGroup: /system.slice/autostart.service
           ├─1189 /home/pi/bin/Server
           └─1198 /home/pi/bin/Client

Oct 20 12:06:40 localhost Server[1189]:   some output from my application

Как бы вы отладили такое поведение?

1 ответ1

1

Вам нужно добавить

[Единица измерения]

Хочет = network.target

После того, как = network.target

К вашему файлу модуля. Между прочим, ваш сервис должен нормально завершать работу, когда он не видит доступной сети, которую systemd не перезапустит автоматически, потому что это не сбой, если ваша служба не завершит работу с ошибкой.

Ваш сервис должен вернуться с ненулевым значением для systemd, чтобы считать его неудачным. Это может быть возвращение 1 в main или exit(1) в любом месте C, например.

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