У меня есть проблема при запуске GPSD на Beaglebone Green. Я добираюсь, сокет связывают ошибку:
root@BBG1:/etc/init# gpsd -D3 -n -N /dev/ttyUSB0
gpsd:INFO: launching (Version 3.16)
gpsd:ERROR: can't bind to IPv4 port gpsd, Address already in use
gpsd:ERROR: maybe gpsd is already running!
gpsd:ERROR: can't bind to IPv6 port gpsd, Address already in use
gpsd:ERROR: maybe gpsd is already running!
gpsd:INFO: command sockets creation failed, netlib errors -1, -1
Кажется, что проблема распространена на этих мини-dev платах (включенный Raspberry Pi), но что, кажется, решает проблему для большинства людей, не работал на меня. Рядом как я могу сказать, это потому что systemd/init
бьют gspd к нему.
root@BBG1:/etc/init# netstat -lnpt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:2947 0.0.0.0:* LISTEN 1/init
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 375/connmand
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 493/sshd
tcp6 0 0 ::1:2947 :::* LISTEN 1/init
tcp6 0 0 :::8080 :::* LISTEN 631/apache2
tcp6 0 0 :::80 :::* LISTEN 1/init
tcp6 0 0 ::1:53 :::* LISTEN 375/connmand
tcp6 0 0 :::22 :::* LISTEN 493/sshd
tcp6 0 0 :::1880 :::* LISTEN 1/init
tcp6 0 0 :::3000 :::* LISTEN 1/init
Я попробовал:
/lib/systemd/system/gpsd.socket
измениться ListenStream
от 127.0.0.1:2947
кому: 0.0.0.0:2947
но когда я перезагружаю, init
связывает с этим вместо этого (как замечено в блоке кода выше). sudo killall gspd
и затем перезапуская снова, но это, кажется, не помогает.изменить /etc/default/gpsd
к следующему:
START_DAEMON="true"
GPSD_OPTIONS=""
DEVICES="/dev/ttyUSB0"
USBAUTO="false"
GPSD_SOCKET="/var/run/gpsd.sock"
пользовательский сценарий начальной загрузки в /etc/rc.local
(предполагаемый задержать запуск gpsd, но это, кажется, не работает, потому что файл startgpsd.txt никогда не обновляет),
#Start the gpsd daemon
/etc/booted/startgpsd.sh
exit 0
который указывает на startgpsd.sh
#!/bin/sh -e
#Need to wait past boot so everything is done
date "+%Y-%m-%d %H:%M:%S" > /startgpsd.txt
sleep 2
echo "Starting GPSD" >> /startgpsd.txt
/usr/local/sbin/gpsd /dev/ttyUSB0 -G -n -F /var/run/gpsd.sock
date "+%Y-%m-%d %H:%M:%S" >> /startgpsd.txt
exit 0
p
Однажды, когда я обновил GSPD от v 3.11 (загруженный apt-get
) к v 3.16 (загрузил двоичный файл и концерт + другого дерьма, таким образом, я мог создать его) это начало работать, но как только я перезагрузил, я вернулся к той же проблеме.
Существует ли способ мешать systemd связать с портом, таким образом, gpsd может вместо этого (или то, что даже моя проблема)? Уничтожение PID 1 не походит на умную вещь сделать, таким образом, я еще не попробовал это. Я почти на грани стирания всего и запускающийся на всем протяжении, но я думал, что попытаюсь использовать 'коллективную силу гения' здесь сначала (учитывая, что я уже нашел несколько решений других проблем здесь в прошлом).
Спасибо!
Править: Добавление содержания /lib/systemd/system/gpsd.socket
[Unit]
Description=GPS (Global Positioning System) Daemon Sockets
[Socket]
ListenStream=/var/run/gpsd.sock
ListenStream=[::1]:2947
ListenStream=0.0.0.0:2947
SocketMode=0600
[Install]
WantedBy=sockets.target
Проблема здесь - то, что у Вас есть конкурирующие методы попытки запустить gpsd и настроить второе.
Первый метод, который Вы используете, systemd
и socket activation
. В этом дизайне, systemd
настраивает второе и ожидает соединения с сокетом. Когда что-то соединяется с сокетом, systemd
активирует сервис, таким образом, он может ответить. Это - "активация сокета". Если Вы хотите использовать этот подход, рекомендуемый читать включает это сообщение в блоге об активации сокета, а также официальные документы для файлов сокета systemd.
Второй метод, который Вы используете, должен запуститься gpsd
работать постоянно через rc.local
и настраивать Ваш собственный сокет. Это в настоящее время перестало работать systemd
уже попытался сделать это для Вас. Если Вы хотите использовать этот метод и отключить systemd
, можно работать:
systemctl stop gpsd
systemctl disable gpsd
Я рекомендую использовать systemd
. Вы не должны использовать функцию активации сокета, если Вы не хотите. systemd
может обработать gpsd
обработает перезапуск демона, если он откажет, который Ваш rc.local
сценарий не делает. systemd
также обработает любой вход, который демон мог бы сделать, который Вашrc.local
сценарий не обрабатывает также.