Debugowanie usystematyzowanej usługi, która przestaje działać podczas uruchamiania

1

Napisałem tę prostą usługę systemową, aby uruchomić moją aplikację przy starcie systemu:

[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

Włączyłem usługę i uruchomiłem ponownie. Po uruchomieniu MyApp nie działa, a status usługi jest „martwy”:

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

bez dalszych wskazówek. O ile wiem, czy moja aplikacja ulega awarii, status powinien zgłosić kod błędu wyjścia. Ponadto powinien zrestartować się po 3 sekundach.

Zamiast tego ręczne uruchomienie usługi prowadzi do oczekiwanego zachowania:

● 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

Jak debugowałbyś takie zachowanie?

znak
źródło
Wielu użytkowników jest zanim sieć będzie dostępna. Czy Twoja usługa poradzi sobie z tym warunkiem?
jdwolf,
Ach! Dobra uwaga, nie, potrzebuję usług sieciowych. Myślałem, że będzie uruchamiany ponownie, dopóki nie będzie dostępny. Stąd co mam napisać w polu After? „Network.target” Myślę, że nie muszę być online.
Mark
Tak, to prawda
jdwolf,

Odpowiedzi:

1

Musisz dodać

[Jednostka]

Chce = sieć. Cel

After = network.target

Do pliku jednostki. Nawiasem mówiąc, twoja usługa musi wyjść normalnie, gdy nie widzi dostępnej sieci, której system nie uruchomi się automatycznie, ponieważ nie jest to awaria, chyba że usługa zakończy się z błędem.

Twoja usługa powinna powrócić z wartością niezerową, aby systemd uznał, że jest to błąd. Może to być na przykład powrót 1 w głównym lub wyjście (1) w dowolnym miejscu w C, na przykład.

jdwolf
źródło