systemd/init связывают с портом

У меня есть проблема при запуске 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

Я попробовал:

  1. изменение /lib/systemd/system/gpsd.socket измениться ListenStreamот 127.0.0.1:2947 кому: 0.0.0.0:2947 но когда я перезагружаю, init связывает с этим вместо этого (как замечено в блоке кода выше).
  2. sudo killall gspd и затем перезапуская снова, но это, кажется, не помогает.
  3. изменить /etc/default/gpsd к следующему:

    START_DAEMON="true"
    GPSD_OPTIONS=""
    DEVICES="/dev/ttyUSB0"
    USBAUTO="false"
    GPSD_SOCKET="/var/run/gpsd.sock"
    
  4. пользовательский сценарий начальной загрузки в /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
0
задан 31 August 2016 в 00:43

1 ответ

Проблема здесь - то, что у Вас есть конкурирующие методы попытки запустить 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 сценарий не обрабатывает также.

1
ответ дан 28 September 2019 в 15:55

Другие вопросы по тегам:

Похожие вопросы: