4

Я написал системный сервис для запуска Groundcontrol на моем Raspberry Pi.

[Unit]
Description=Groundcontrol status monitor

[Service]
ExecStart=/opt/groundcontrol/groundcontrol/start.sh
Type=forking

[Install]
WantedBy=multi-user.target  

Я использую сценарий, потому что groundcontrol не будет работать должным образом, если он не запущен из каталога bin. Вот сценарий:

cd /opt/groundcontrol/groundcontrol
./groundcontrol &

Это прекрасно работает, когда я запускаю его вручную, но когда я запускаю свой Pi и запускаю systemctl он говорит, что это не удалось. systemctl status groundcontrol.service печатает

groundcontrol.service - Groundcontrol status monitor
   Loaded: loaded (/etc/systemd/system/groundcontrol.service; enabled)
   Active: failed (Result: exit-code) since Wed 1969-12-31 17:00:14 MST; 43 years 11 months ago
  Process: 111 ExecStart=/opt/groundcontrol/groundcontrol/start.sh (code=exited, status=0/SUCCESS)
 Main PID: 116 (code=exited, status=2)

Dec 31 17:00:11 waldo systemd[1]: Starting Groundcontrol status monitor...
Dec 31 17:00:12 waldo systemd[1]: Started Groundcontrol status monitor.
Dec 31 17:00:14 waldo systemd[1]: groundcontrol.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 31 17:00:14 waldo systemd[1]: Unit groundcontrol.service entered failed state. 

Когда я запускаю его вручную, статус

groundcontrol.service - Groundcontrol status monitor
   Loaded: loaded (/etc/systemd/system/groundcontrol.service; enabled)
   Active: active (running) since Thu 2013-12-26 15:38:02 MST; 1s ago
  Process: 296 ExecStart=/opt/groundcontrol/groundcontrol/start.sh (code=exited, status=0/SUCCESS)
 Main PID: 297 (groundcontrol)
   CGroup: /system.slice/groundcontrol.service
           `-297 ./groundcontrol

Dec 26 15:38:02 waldo systemd[1]: Started Groundcontrol status monitor. 

Был сценарий инициализации System V, предоставленный Groundcontrol, но я не знал, как использовать его с systemd - возможно ли это, и будет ли он работать лучше, чем мой сервис? Если нет, как я могу исправить эту услугу? Благодарю.

1 ответ1

4

Журналы говорят:

main process exited, code=exited, status=2/INVALIDARGUMENT

Это означает, что проблема в самом groundcontrol ; он вернул статус 2 (своего рода сбой).

Обычно эта конкретная проблема - сбой службы только при загрузке - вызвана слишком ранним запуском службы, то есть когда ей требуется какое-то аппаратное устройство, которое еще не было обнаружено системой. (Помните, что в современных системах Linux практически все устройства обнаруживаются динамически; нет смысла говорить «о, у меня есть все устройства, давайте запустим init».)

Решением было бы переписать программу для использования libudev и динамически добавлять устройства.

Обходной путь - заказать услугу после определенного устройства (хотя я не знаю, какое устройство ему нужно, поэтому я не могу дать полный ответ), или используйте Wants = + After =, чтобы получить systemd-udev-settle.service который ожидает, пока udev обработает первую партию событий "нового устройства".


Кроме того, почему у вас есть целый отдельный сценарий .sh для единственной цели cd'ing в каталог? WorkingDirectory= + Type=simple будет достаточно. (Символ & также не нужен, так как сама systemd, будучи менеджером сервисов, запускает все в фоновом режиме.)

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