systemd / init liga à porta

0

Estou com um problema ao iniciar o GPSD em um Beaglebone Green. Eu recebo um erro de ligação de soquete:

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

Parece que a questão é comum nessas placas mini dev (Raspberry Pi incluído), mas o que parece resolver o problema para a maioria das pessoas não funcionou para mim. Por mais que eu saiba, é porque systemd/init está batendo o gspd nele.

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

Eu tentei:

  1. modificando /lib/systemd/system/gpsd.socket para alterar ListenStream de 127.0.0.1:2947 para 0.0.0.0:2947 , mas quando eu reinicializo, init liga-se a ele (como visto no bloco de código acima).
  2. sudo killall gspd e, em seguida, reiniciar novamente, mas isso não parece ajudar.
  3. modifique /etc/default/gpsd para o seguinte:

    START_DAEMON="true"
    GPSD_OPTIONS=""
    DEVICES="/dev/ttyUSB0"
    USBAUTO="false"
    GPSD_SOCKET="/var/run/gpsd.sock"
    
  4. um script de inicialização personalizado em /etc/rc.local (deve atrasar a inicialização do gpsd, mas parece não estar em execução porque o arquivo startgpsd.txt nunca é atualizado)

    #Start the gpsd daemon
    /etc/booted/startgpsd.sh
    exit 0
    

que aponta para 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

Em um ponto, quando atualizei o GSPD de v 3.11 (baixado com apt-get ) para v 3.16 (baixei o binário e um gig + de outra porcaria para que eu pudesse construí-lo) ele começou a funcionar, mas assim que eu reiniciei estava de volta ao mesmo problema.

Existe uma maneira de impedir que o systemd seja vinculado à porta para que o gpsd possa, em vez disso (ou isso é mesmo o meu problema)? Matar o PID 1 não parece ser uma coisa inteligente para fazer, então eu não tentei isso ainda. Eu estou quase no ponto de limpar tudo e começar tudo de novo, mas eu pensei que eu tentaria aproveitar o 'poder coletivo do gênio' aqui primeiro (dado que eu já encontrei várias respostas para outros problemas aqui no passado) .

Obrigado!

Editar: Adicionando o conteúdo de /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
    
por beijota2 27.08.2016 / 00:34

1 resposta

1

A questão aqui é que você tem métodos concorrentes de tentar iniciar o gpsd e configurar o segundo.

O primeiro método que você está usando é systemd e socket activation . Nesse design, systemd configura o segundo e aguarda uma conexão com o soquete. Quando algo se conecta ao soquete, systemd ativa o serviço para que ele possa responder. Isso é "ativação de soquete". Se você quiser usar essa abordagem, a leitura recomendada inclui esta postagem do blog sobre a ativação do soquete, bem como a documentos oficiais para arquivos de soquete systemd .

O segundo método que você está usando é iniciar gpsd para executar persistentemente via rc.local e para configurar seu próprio soquete. Isso falha atualmente systemd já tentou fazer isso por você. Se você deseja usar este método e desabilitar systemd , você pode executar:

systemctl stop gpsd
systemctl disable gpsd

Eu recomendo usar systemd . Você não precisa usar o recurso de ativação de soquete se não quiser. systemd pode manipular gpsd tratará de reiniciar o daemon se ele falhar, o que seu script rc.local não faz. systemd também manipulará qualquer registro em log que o daemon possa fazer, o qual seu script rc.local não manipula.

    
por Mark Stosberg 29.08.2016 / 20:35