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?
Odpowiedzi:
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.
źródło