gpsd запускается до того, как устройство будет готово

У меня есть служба, которая запускается при загрузке и подключается к gpsd через gpsd API Python. Таким образом, gpsd запустится сразу после загрузки.

Если я запускаю любую службу вручную во время работы системы, все работает нормально. Но когда я перезагружу систему, service gpsd status напечатает это:

# service gpsd status
● gpsd.service - GPS (Global Positioning System) Daemon
   Loaded: loaded (/lib/systemd/system/gpsd.service; indirect; vendor preset: enabled)
   Active: active (running) since Tue 2020-07-21 08:15:47 EDT; 2min 47s ago
  Process: 5659 ExecStart=/usr/sbin/gpsd $GPSD_OPTIONS $DEVICES (code=exited, status=0/SUCCESS)
 Main PID: 5690 (gpsd)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/gpsd.service
           └─5690 /usr/sbin/gpsd /dev/ttyUSB1

Jul 21 08:15:47 nvidia-desktop systemd[1]: Starting GPS (Global Positioning System) Daemon...
Jul 21 08:15:47 nvidia-desktop systemd[1]: Started GPS (Global Positioning System) Daemon.
Jul 21 08:15:47 nvidia-desktop gpsd[5690]: gpsd:ERROR: SER: device open of /dev/ttyUSB1 failed: No such file or directory - retrying read-only
Jul 21 08:15:47 nvidia-desktop gpsd[5690]: gpsd:ERROR: SER: read-only device open of /dev/ttyUSB1 failed: No such file or directory
Jul 21 08:15:47 nvidia-desktop gpsd[5690]: gpsd:ERROR: /dev/ttyUSB1: device activation failed.
Jul 21 08:15:47 nvidia-desktop gpsd[5690]: gpsd:ERROR: /dev/ttyUSB1: activation failed, freeing device

gpsd просто не работает.

Я предполагаю, что gpsd-демон пытается открыть /dev/ttyUSB1 до того, как ядро ​​сможет создать это устройство, а затем окажется в состоянии ошибки.

Что я мог сделать, чтобы заставить его работать в чистом виде?

РЕДАКТИРОВАТЬ: моя текущая работа - это сон в клиентском сценарии gpsd.


person JulianH    schedule 21.07.2020    source источник


Ответы (1)


Что я мог сделать, чтобы заставить его работать в чистом виде?

Заставьте службу gpsd ждать /dev/ttyUSB1.

Отредактируйте службу: systemctl edit gpsd.service, и я думаю, что она должна это сделать:

[Unit]
BindsTo=dev-ttyUSB1.device
# or maybe also
After=dev-ttyUSB1.device

Действительно чистый способ точного соответствия вашему устройству — написать правило udev для соответствия вашему устройству, чтобы создать специальную запись /dev/your_device dev, а затем подождать и открыть конкретно это устройство в вашей службе systemd.

person KamilCuk    schedule 21.07.2020
comment
Я уже знал эти строки, но дело в том, что gpsd только запускается, когда клиент пытается подключиться к сокету gpsd, т.е. добавление этих строк в сервис-файл gpsd ничего не дает (это всего лишь предположение, поправьте меня, если я ошибаюсь неправильный). Но если добавить эти строки в сервис-файл службы, которая обращается к сокету, то все работает нормально. Вы заставили меня поверить, что я на правильном пути, так что спасибо. - person JulianH; 21.07.2020
comment
Повезло тебе! Ни, я не буду редактировать, потому что я не знаю, что редактировать; / which is accesing the socket Разве этот не должен ждать gpsd.socket? - person KamilCuk; 21.07.2020