OpenwebRX Autostart mit Systemd und Screen

Wer mit OpenwebRX arbeitet,sollte seinen Raspberry Pi ab und an mal neu starten.
Damit das so einfach wie möglich geht, und man OpenwebRX in den Autostart bekommt, bedient man sich einfach Systemd und seinen Units.
Damit der OpenwebRX Output dann auch noch via SSH sichtbar ist, sperren Wir das ganze noch in eine Screen Session ein, die sich via Terminal jederzeit und überall aufrufen lässt.

Erst einmal werden die Paketlisten und das System aktualisiert, was schon ein bisschen Zeit in Anspruch nehmen kann.

sudo apt-get update
sudo apt-get upgrade

Anschließend installieren Wir Den Terminal Multiplexer Screen
sudo apt-get install screen

Jetzt brauchen Wir ein script, was OpenwebRx startet, da sich Python Dateien, zumindest bei mir, nicht sauber via Systemd haben starten lassen.

Wo das Script letztendlich liegt ist egal, Hauptsachen Ihr findet es wieder. Wink
Ich habe dazu unter /home/pi/ den Ordner /scripts angelegt.
sudo mkdir /home/pi/scripts/

Dort erstellen Wir jetzt unser Startscript.
sudo nano /home/pi/scripts/openwebrx.sh

In dieses Script tragen Wir folgendes ein :

#!/bin/sh
cd /home/pi/openwebrx/
./openwebrx.py 

Anschließend Speichern Wir das Script mit STRG+O und einem anschließenden Enter und verlassen den Editor mit STRG+X und Enter.

Den absoluten Pfad des Scriptes merken Wir uns, denn den tragen Wir in die Systemd Unit ein.

Die Systemd Unit erstellen Wir im Ordner /lib/systemd/system unter dem Namen openwebrx.service.
sudo nano /lib/systemd/system/openwebrx.service

Dort tragen Wir folgendes ein :

[Unit]
Description=OpenWebRX
After=syslog.target network.target

[Service]
User=root
ExecStart=/usr/bin/screen -S OpenwebRX -D -m /home/pi/scripts/openwebrx.sh
ExecStop=/usr/bin/screen -S OpenwebRX -X quit

[Install]
WantedBy=multi-user.target

Anschließend Speichern Wir die Unit mit STRG+O und einem anschließenden Enter und verlassen den Editor mit STRG+X und Enter.

Nun legen Wir im gleichen Verzeichnis, den zur Service Unit gehörigen Timer, openwebrx.timer an.
sudo nano /lib/systemd/system/openwebrx.timer

Dort tragen Wir ein :

[Unit]
Description=OpenwebRX

[Timer]
OnStartupSec=60
Persistent=true
Unit=openwebrx.service

[Install]
WantedBy=multi-user.target

Auch hier speichern Wir wieder mit STRG+O und Enter, und verlassen den Editor mit STRG+X und Enter.

Nun zeigen Wir Systemd den neuen Dienst und aktivieren Ihn.

sudo systemctl daemon-reload

sudo systemctl enable openwebrx.service

sudo systemctl enable openwebrx.timer

Das systemctl daemon-reload Kommando sollte übrigens immer nach dem Neuanlegen, oder ändern einer Unit erfolgen.

Nun sind der Service und der Timer im systemd aktiviert.
Wenn alles korrekt ist, startet OpenwebRX beim nächsten Systemstart automatisch, und lässt sich in Screen auch bei SSH-Session ansehen.

Jetzt aber erst mal neu starten. Da Ich beim einfachen Reboot immer wieder erlebe, das Dateisysteme unsauber ausgeworfen werden, macht es am besten so :

sudo shutdown -r now

Wenn das System neu gestartet ist, testen Wir mal ob alles geht.

sudo systemctl status openwebrx.service

Im Terminal sollte dann in etwa dieses angezeigt werden :

pi@pi3:~ $ sudo systemctl status openwebrx.service
● openwebrx.service - OpenWebRX
   Loaded: loaded (/lib/systemd/system/openwebrx.service; enabled)
   Active: active (running) since Sa 2016-12-03 20:01:09 CET; 1h 35min ago
 Main PID: 497 (screen)
   CGroup: /system.slice/openwebrx.service
           ├─497 /usr/bin/SCREEN -S OpenwebRX -D -m /home/pi/scripts/openwebrx.sh
           ├─560 /bin/sh /home/pi/scripts/openwebrx.sh
           ├─562 /usr/bin/python2 ./openwebrx.py
           ├─576 /bin/sh -c rtl_sdr -s 2048000 -f 145000000 -p 59 -g 48 -| ncat -4l 4951 -k --send-only --allow 127.0.0.1
           ├─577 rtl_sdr -s 2048000 -f 145000000 -p 59 -g 48 -
           ├─578 ncat -4l 4951 -k --send-only --allow 127.0.0.1
           ├─587 /bin/sh -c ncat -v 127.0.0.1 4951 | csdr setbuf 94720 | csdr convert_u8_f | csdr fft_cc 1024 409600 | csd...
           ├─588 ncat -v 127.0.0.1 4951
           ├─589 csdr setbuf 94720
           ├─590 csdr convert_u8_f
           ├─591 csdr fft_cc 1024 409600
           ├─592 csdr logpower_cf -70
           ├─593 csdr fft_exchange_sides_ff 1024
           └─594 csdr compress_fft_adpcm_f_u8 1024

Dez 03 20:01:09 pi3 systemd[1]: Starting OpenWebRX...
Dez 03 20:01:09 pi3 systemd[1]: Started OpenWebRX.
Dez 03 20:01:41 pi3 systemd[1]: Started OpenWebRX.

Schauen Wir nun ob in Screen alles korrekt ist.
Das Kommando sudo screen -list sollte dies hier ausgeben :

pi@pi3:~ $ sudo screen -list
There is a screen on:
        497.OpenwebRX   (03.12.2016 20:01:15)   (Detached)
1 Socket in /var/run/screen/S-root.

Mit dem Kommando sudo screen -r OpenwebRX holen Wir uns die Terminal Ausgabe auf das aktuelle Terminal, egal ob Wir direkt am Raspi sitzen, oder über SSH rangehen.

Das sieht dann ungefähr so aus :

pi@pi3:~ $ sudo screen -r OpenwebRX
    myself.wfile.write(header+data_to_send)
  File "/usr/lib/python2.7/socket.py", line 324, in write
    self.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
[openwebrx-httpd] client 91.66.185.228#2ef6dd1128a08d69c817d877e2d6cf4f :: client being closed.
[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: /tmp/openwebrx_pipe_1987308200_bpf
[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: /tmp/openwebrx_pipe_1987308200_shift
[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: /tmp/openwebrx_pipe_1987308200_squelch
[openwebrx-dsp-plugin:csdr] stop() :: unlink failed: /tmp/openwebrx_pipe_1987308200_smeter
----------------------------------------
Exception happened during processing of request from ('91.66.185.228', 51541)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 599, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python2.7/SocketServer.py", line 657, in __init__
    self.finish()
  File "/usr/lib/python2.7/SocketServer.py", line 716, in finish
    self.wfile.close()
  File "/usr/lib/python2.7/socket.py", line 279, in close
    self.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
[openwebrx-httpd] GET /status/ from 152.66.211.30
[openwebrx-httpd] GET /status/ from 152.66.211.30
[openwebrx-httpd] GET /status/ from 152.66.211.30
[openwebrx-httpd] GET /status/ from 152.66.211.30
[openwebrx-httpd] GET /status/ from 152.66.211.30
[openwebrx-httpd] GET /status/ from 152.66.211.30
[openwebrx-httpd] GET /status/ from 152.66.211.30
[openwebrx-sdrhu] Update succeeded!
[openwebrx-httpd] GET /status/ from 152.66.211.30
[openwebrx-httpd] GET /status/ from 152.66.211.30

!!! Achtung !!! Mit STRG+C beendet Ihr nicht nur die Screen Ausgabe sondern das gesamte Script.
Mit STRG+A beendet Ihr die Terminal Ausgabe, ohne OpenwebRX zu beenden.

Hier noch die Kommandos für Systemd und Screen, die notwendig sind :

systemctl start openwebrx.service  -- OpenwebRX Service starten
systemctl restart openwebrx.service  -- OpenwebRX Service neu starten
systemctl stop openwebrx.service  -- OpenwebRX Service beenden
systemctl status openwebrx.service  -- OpenwebRX Service abfragen

screen -r OpenwebRX  -- Terminaloutput von OpenwebRX auf dem aktuellen Terminal anzeigen

In einer laufenden Screen Ausgabe :
STRG + A  D --aktuelle Ausgabe des Terminal Outputs beenden, ohne OpenwebRX zu beenden
STRG + A ?  --Übersicht aller Tastenkürzel in Screen
screen -list  --aktuell verfügbare Screen Sessions anzeigen lassen